87、android处理耗时任务

https://www.jianshu.com/p/e8cc603b8466

1、AsyncTask

https://blog.csdn.net/qq_31384551/article/details/90407003

class DownloadTask extends AsyncTask{  
    // AsyncTask
    //后面尖括号内分别是参数(例子里是线程休息时间),进度(publishProgress用到),返回值类型
    @Override
    protected void onPreExecute() {
        //第一个执行方法
        super.onPreExecute();
    }
    @Override
    protected String doInBackground(Integer... params) {
        //第二个执行方法,onPreExecute()执行完后执行
        for(int i=0;i<=100;i++){
            publishProgress(i);
            try {
                Thread.sleep(params[0]);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return "执行完毕";
    }
    @Override
    protected void onProgressUpdate(Integer... progress) {
        //这个函数在doInBackground调用publishProgress时触发,虽然调用时只有一个参数
        //但是这里取到的是一个数组,所以要用progesss[0]来取值
        //第n个参数就用progress[n]来取值
        tv.setText(progress[0]+"%");
        super.onProgressUpdate(progress);
    }
    @Override
    protected void onPostExecute(String result) {
        //doInBackground返回时触发,换句话说,就是doInBackground执行完后触发
        //这里的result就是上面doInBackground执行后的返回值,所以这里是"执行完毕"
        setTitle(result);
        super.onPostExecute(result);
    }
}

优缺点:

  1. 处理单个异步任务简单,可以获取到异步任务的进度
  2. 可以通过cancel方法取消还没执行完的AsyncTask
  3. 处理多个异步任务代码显得较多

适用:1. 单个异步任务的处理

2、Handler+Thread

https://www.iteye.com/blog/gqdy365-2112471

https://blog.csdn.net/w2865673691/article/details/46007713

方法一:

1、主线程中定义Handler: 
 

Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
            case 0:
                //完成主界面UI现程更新,拿到数据
                String data = (String)msg.obj;
               
                updateWeather();
                textView.setText(data);
                break;
            default:
                break;
            }
        }  };
 

2、子线程发消息,通知Handler完成UI更新: 

1)、

  1.  new Thread(new Runnable(){  
  2.             @Override  
  3.             public void run() {  
  4.                 //耗时操作,完成之后发送消息给Handler,完成UI更新;  
  5.                 mHandler.sendEmptyMessage(0);  
  6.                   
  7.                 //需要数据传递,用下面方法;  
  8.                 Message msg =new Message();  
  9.                 msg.obj = "数据";//可以是基本类型,可以是对象,可以是List、map等;  
  10.                 mHandler.sendMessage(msg);  
  11.             }  
  12.               
  13.         }).start();  

 2、

Runnable updateThread =new Runnable(){

@Override

public void run(){
     //耗时操作

       todo.......

     //发送消息
      handler.sendMessage(msg);
 }

}

 

 

方法二:用Activity对象的runOnUiThread方法更新 
在子线程中通过runOnUiThread()方法更新UI: 

new Thread() {
            public void run() {
                //这儿是耗时操作,完成之后更新UI;


                runOnUiThread(new Runnable(){

                    @Override
                    public void run() {
                        //更新UI
                        imageView.setImageBitmap(bitmap);
                    }
                    
                });
            }
        }.start();
 

 如果在非上下文类中(Activity),可以通过传递上下文实现调用;

Activity activity = (Activity) imageView.getContext();
                activity.runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        imageView.setImageBitmap(bitmap);
                    }
                });
 

优缺点

  1. Handler用法简单明了,可以将多个异步任务更新UI的代码放在一起,清晰明了
  2. 处理单个异步任务代码略显多

适用范围:1. 多个异步任务的更新UI。

3.IntentService

https://www.cnblogs.com/huaqing-wkc/p/4942779.html

https://www.jianshu.com/p/8c4181049564

https://blog.csdn.net/wjlsxl_whb/article/details/78036932?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.compare&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.compare

https://blog.csdn.net/weixin_33804582/article/details/93939289

https://blog.csdn.net/carson_ho/article/details/90437126

4.HandlerThread

https://blog.csdn.net/hust_twj/article/details/87884318?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.compare

https://blog.csdn.net/carson_ho/article/details/52693418?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-9.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-9.compare

https://www.cnblogs.com/zhaoyanjun/p/6062880.html

https://www.cnblogs.com/Ocean123123/p/11022543.html

https://blog.csdn.net/carson_ho/article/details/90287006

https://www.jianshu.com/p/25e9aad4e608

 

 

 

 

你可能感兴趣的:(android)