美文网首页
手动撸一个AsyncTask

手动撸一个AsyncTask

作者: PlutoWnn | 来源:发表于2018-01-23 18:26 被阅读10次

    前言:很多时候都需要用线程来操作耗时操作,为了更加深入的了解一下AsyncTask的工作原理,决定手动撸一个AsyncTask.

    通过HandlerThread消息列队来操作AsyncTask.然后再创建两个Handler,一个是关联UI线程消息列队的mUIHandler和关联HandlerThread子线程的mAsyncHandler.通过这两个Handler来更新UI和执行耗时操作。具体代码如下:

    public abstract class SimpleAsyncTask<T> {
    private final static String TAG = SimpleAsyncTask.class.getSimpleName();
    private static final HandlerThread HT = new HandlerThread("SimpleAsyncTask");

    static {
        HT.start();
    }
    
    //获取调用execute的线程Looper,构建Handler.
    final Handler mUIHandler = new Handler(Looper.getMainLooper());
    //与异步线程队列关联的Handler
    final Handler mAsyncHandler = new Handler(HT.getLooper());
    
    //onPreExecute任务执行前的初始化操作
    protected void onPreExecute() {
    }
    
    //后台执行任务返回结果
    protected abstract T doInBackground();
    
    //返回的结果传递给UI线程.
    protected void onPostExecute(T result) {
    }
    
    //execute方法进行处理结果
    
    public final SimpleAsyncTask<T> execute() {
    
        onPreExecute();
        mAsyncHandler.post(new Runnable() {
            @Override
            public void run() {
                postResult(doInBackground());
            }
        });
        return this;
    }
    
    private void postResult(final T result) {
        mUIHandler.post(new Runnable() {
            @Override
            public void run() {
                onPostExecute(result);
            }
        });
    }
    

    }
    不大熟悉markdown的流程,代码传的比较丑,擦汗。。。。。。
    下面我们再Actiivty里面测试一下代码,就延时发送一个Toast好了:

    代码如下:

        new SimpleAsyncTask<String>() {
            private void makeToast(String msg) {
                Toast.makeText(CustomViewActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
    
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                makeToast("onPreExecute");
            }
    
            @Override
            protected String doInBackground() {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return "hello";
            }
    
            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);
                makeToast(result);
            }
        }.execute();
    

    可以发现是可以使用的。到此就结束了。

    相关文章

      网友评论

          本文标题:手动撸一个AsyncTask

          本文链接:https://www.haomeiwen.com/subject/yjfeaxtx.html