在Android中实现异步任务机制有两种方式,Handler和AsyncTask
Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制
为了简化操作,Android1.5提供了工具类android.os.AsyncTask,它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。
在使用的时候,有几点需要格外注意:
1.异步任务的实例必须在UI线程中创建。
2.execute(Params... params)方法必须在UI线程中调用。
3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params... params)中更改UI组件的信息。
5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。
以上内容转自:http://blog.csdn.net/liuhe688/article/details/6532519
下面做了一个用AsyncTask 获取网络图片的实例
xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <EditText android:id="@+id/urlpath" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="http://www.baidu.com/img/bdlogo.gif" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="获取网络图片" /> <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
Activity:
public class MainActivity extends Activity { private MyTask mytask; private Button button; private EditText editText; private static ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText=(EditText) findViewById(R.id.urlpath); imageView=(ImageView) findViewById(R.id.image); button=(Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mytask=new MyTask(getApplicationContext(),imageView); String url=editText.getText().toString(); mytask.execute(url); //传入的参数 为一个url 参数地址 } }); } }
MyTask 类:
public class MyTask extends AsyncTask<String, Integer, byte[]>{ private Context context; private ImageView imageView; public MyTask(Context context,ImageView imageView) { this.context=context; this.imageView=imageView; } //doInBackground方法内部执行后台任务,不可在此方法内修改UI //比如超时的任务 下载数据等操作可以在此方法里面写 protected byte[] doInBackground(String... params) { Log.i("MyTask", "-----------doInBackground"); HttpClient client=new DefaultHttpClient(); //创建一个http客户端请求 HttpGet request=new HttpGet(params[0]); //创建一个get请求对象 try { HttpResponse response=client.execute(request); //设置执行请求 if(response.getStatusLine().getStatusCode() ==200){ HttpEntity entity=response.getEntity(); //得到一个实体对象 InputStream input=entity.getContent(); //得到输入流 byte[] data=StreamTool.read(input); return data; } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } //onPreExecute方法用于在执行后台任务前做一些UI操作 @Override protected void onPreExecute() { Log.i("MyTask", "-----------onPreExecute"); Toast.makeText(context, "马上开始下载", 1).show(); } //onPostExecute方法用于在执行完后台任务后更新UI,显示结果 @Override protected void onPostExecute(byte[] result) { Log.i("MyTask", "-----------onPostExecute"); //byte[] data=result.getBytes(); Bitmap bitmap=BitmapFactory.decodeByteArray(result, 0, result.length); imageView.setImageBitmap(bitmap); } }