Android对于AsyncTask任务的封装

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/StrangeNightmare/article/details/52922546

     转载请注明来自于:http://blog.csdn.net/strangenightmare/article/details/52922546

     无意间在公司代码中看到前任同事对于AsyncTask类的封装很漂亮。所以自己就尝试模仿了一版。毕竟AsyncTask写起来要好多行,看着并不漂亮。索性封装起来在使用的时候调用一下就可以了。精简代码。

     对于AsyncTask我就不多说了,做Android开发的人对于这个类应该是太熟悉不过了。这个类在异步程序使用时简单便捷,过程也可控。但是缺点就是多个异步操作如果对UI有修改时候,就会变得太过于鸡肋。这种情况还是Handler才能游刃有余。具体这一块还是建议大家去多百度吧。我就不班门弄斧了,毕竟我也是菜鸟-_-||

     言归正传,我的封装主要是利用回调机制,将任务的控制交还给主控制类。其实没啥技术含量,纯属自己用着方便,也算自己强化一下回调的使用吧。一共有两个类,一个类是接口类,一个类是Task类。


这个是接口类,里面主要写了AsyncTask常用的4个接口

/**
 * Created by xiaonan on 16/10/24.
 */

public interface TaskCallbacker {
    void OnPreTask();
    String OnBackgroundTask();
    void OnUpdateProgress(int progress);
    void OnPostTask(Object result);
}


这个是Task类,继承了AsyncTask<String,Integer,String>,具体这三个参数什么意思,可以自行百度

import android.os.AsyncTask;

/**
 * Created by xiaonan on 16/10/24.
 */

public class MyTask extends AsyncTask<String,Integer,String> {
    private static TaskCallbacker tcb;
    public MyTask(TaskCallbacker callbacker){
        this.tcb = callbacker;
    }

    @Override
    protected void onPreExecute() {
        tcb.OnPreTask();
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... strings) {
        String result = tcb.OnBackgroundTask();
        return result;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        tcb.OnUpdateProgress(values[0]);
        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(String result) {
        tcb.OnPostTask(result);
        super.onPostExecute(result);
    }
}

        AsyncTask<String,Integer,String>的这三个参数可以根据你的具体业务去调整,我只是根据自己的需求用了这三个。第一个就是执行execute("start")传入的值得类型;第二个参数是用于更新进度条之类的传入Integer类型;第三个参数是返回值的类型。

     关于这个类的调用,我写了以下这个示例。我用一个线程睡眠3秒来模拟网络下载阻塞线程的操作。

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private static TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv);
        TestTask();
    }

    public void TestTask(){
        MyTask task = new MyTask(new TaskCallbacker() {
            @Override
            public void OnPreTask() {
                System.out.println("打印一行字,任务开始了");
            }

            @Override
            public String OnBackgroundTask() {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return "耗时任务执行完毕";
            }

            @Override
            public void OnUpdateProgress(int progress) {

            }

            @Override
            public void OnPostTask(Object result) {
                System.out.println(result);
                tv.setText("任务执行完毕");
            }
        });
        task.execute("start");
    }

}

     如果大家有什么建议,欢迎给我发私信留言。我不定期会上来看哒!!





阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页