Handler和AsyncTask异步方式的实现

1.Handler异步方式的实现

在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)运行并生成 Looper获取Message并传递给Handler逐个获取Looper中的Message,并进行UI变更。Handler可以分发Message对象和Runnable对象到主线程中,每个Handler实例都会绑定到他创建的线程中。

Handler中分发消息的一些办法
handler.post(Runnable );将Runnable直接添加入队列
handler.postDelayed(Runnable, long)延迟一定时间后,将Runnable添加入队列
handler.postAtTime(Runnable,long)定时将Runnable添加入队列
终止线程:handler.removeCallbacks(thread);将Runnable从Runnable队列中取出

public class HandlerActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView mText1;
    private Button mBtn1;
    private static final int UPDATE_TEXT = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.handler_activity);
        mText1 = (TextView)findViewById(R.id.text1);
        mBtn1 = (Button)findViewById(R.id.button1);
        mBtn1.setOnClickListener(this);

    }
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch(msg.what){
                case UPDATE_TEXT:
                    mText1.setText("Bye");
                    break;
                default:
                    break;
            }
        }
    };
    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.button1:
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Message message = new Message();
                        message.what = UPDATE_TEXT;
                        handler.sendMessage(message);
                    }
                }).start();
                break;
            default:
                break;
        }

    }
}

2.AsyncTask异步方式的实现

AsyncTask定义了三种泛型类型 Params,Progress和Result。

①Params 启动任务执行的输入参数,比如HTTP请求的URL。
②Progress 后台任务执行的百分比。
③Result 后台执行任务最终返回的结果,比如String。

AsyncTask的四个重要方法:
①onPreExecute(),在UI线程中执行,它会在异步任务开始前执行,一般用来设置任务参数;
②doInBackground, 最重要的方法,在子线程中执行(事实上,只有它在子线程中执行,其他方法都在UI线程中执行)。当onPreExecute结束后,本方法立刻执行,它用来进行后台的耗时计算,异步任务的参数会被传给它,执行完成的结果会被送给第四步;执行途中,它还可以调用publishProgress 方法来通知UI线程当前执行的进度;
③onProgressUpdate, 当publishProgress 被调用后,它在UI线程中执行,刷新任务进度,一般用来刷新进度条等UI部件;
④onPostExecute, 当后台的异步任务完成后,它会在UI线程中被调用,并获取异步任务执行完成的结果。

public class MainActivity extends AppCompatActivity {

    private TextView mText;
    private Button mBtn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mText = (TextView)findViewById(R.id.text);
        mBtn = (Button)findViewById(R.id.button);
        mBtn.setOnClickListener(new Button.OnClickListener(){
            @Override
            public void onClick(View view) {
                update();
            }
        });
    }

    private void update() {
        DownloadTask downloadTask = new DownloadTask(this);
        downloadTask.execute();
    }
    public class DownloadTask extends AsyncTask {
        private Context context;
        DownloadTask(Context context) {
            this.context = context;
        }
        @Override
        protected void onPreExecute(){
            Toast.makeText(context,"开始执行",Toast.LENGTH_SHORT).show();
        }
        @Override
        protected Boolean doInBackground(Void... params){
            int i = 0;
            try{
                while(true){
                    i++;
                    publishProgress(i);
                    try{
                        Thread.sleep(100);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                    if(i >= 100){
                        break;
                    }
                }
            }catch (Exception e){
                return  false;
            }
            return true;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            mBtn.setText("下载完成");
            mBtn.setEnabled(false);
            Toast.makeText(context,"执行完毕",Toast.LENGTH_SHORT).show();
        }
        @Override
        protected void onProgressUpdate(Integer... values) {
            //progressBar.setProgress(values[0]);
            mText.setText("下载中"+values[0]+"%");
            //  mText.setText("Hello");
        }

    }

}

你可能感兴趣的