zoukankan      html  css  js  c++  java
  • 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);
        }
    }
     
  • 相关阅读:
    错误记录(一):VSCode
    【洛谷P4770】你的名字
    【洛谷P3177】树上染色
    【洛谷P3704】数字表格
    【CF762F】Tree nesting
    【洛谷P5064】等这场战争结束之后
    【洛谷P3346】诸神眷顾的幻想乡
    【BZOJ#2119】股市的预测
    UiPath数据抓取Data Scraping的介绍和使用
    UiPath录制器的介绍和使用
  • 原文地址:https://www.cnblogs.com/xiaxiayige/p/3445335.html
Copyright © 2011-2022 走看看