android 学习之AsyncTask

在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);
    }
}

 

 

 

posted @ 2013-11-27 12:06  小小小小小小菜鸟  阅读(237)  评论(0编辑  收藏  举报