异步加载

  1. AsyncTask
    AsyncTask简介 AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦。阅读 AsyncTask的源码可知,AsyncTask是使用java.util.concurrent 框架来管理线程以及任务的执行的,concurrent框架是一个非常 成熟,高效的框架,经过了严格的测试。这说明AsyncTask的设计很好的解决了匿名线程存在的问题。 AsyncTask是抽象类,其结构图如下图所示:
    Params 启动任务执行的输入参数,比如HTTP请求的URL。
    Result 后台执行任务最终返回的结果,比如String。
    子类必须实现抽象方法doInBackground(Params… p) ,在此方法中实现任务的执行工作,比如连接网络获取数据等。
    通常还应 该实现onPostExecute(Result r)方法,因为应用程序关心的结果在此方法中返回。需要注意的是AsyncTask一定要在主线程中创 建实例。
    AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,需要注意的是这些方法不应该由应用程序调用,开发者需要做的 就是实现这些方法。在任务的执行过程中,这些方法被自动调用,运行过程,如下图所示:
    onPreExecute() 当任务执行之前开始调用此方法,可以在这里显示进度对话框。
    在执行过程中可以调用 publicProgress(Progress…)来更新任务的进度。
    onProgressUpdate(Progress…) 此方法在主线程执行,用于显示任务执行的进度。
    onPostExecute(Result) 此方法在主线程执行,任务执行的结果作为此方法的参数返回
//主线程中调用异步
new MyAsyncTask(textview).execute(params);
//取消异步操作//需要与activity生命周期一致则写入onPause()
if (asyncTask != null && asyncTask.getStatus() == AsyncTask.Status.RUNNING) {
    asyncTask.cancel(true);//cancel只是标记状态,并不是真正取消要在异步中判断状态
}
//异步类
class MyAsyncTask extends AsyncTask<String, Void, String> {//params progress result
    TextView tv;

    public MyAsyncTask(TextView textview) {
        tv = textview;
    }
    @Override
    protected String doInBackground(String... params) {
        if (isCancelled()) {//判断线程状态,可中断耗时操作
        }
        return params[0];
    }

    @Override
    protected void onPostExecute(String s) {
        if (isCancelled()) {//判断线程状态,可中断耗时操作
        }
        if (tv != null) {
            tv.setText(s);
        }
    }
}

2.采用Thread + Handler + Message
handler简介 Handler为Android提供了一种异步消息处理机制,它包含两个队列,一个是线程列队,另一个是消息列队。使用post方法将线 程对象添加到线程队列中,使用
继而回调Handler中public void handleMessage(Message msg)方法。因此 在创建Handler时应该使用匿名内部类重写该方法。
如果想要这个流程一直执行的话,可以再run方法内部执行postDelay或者 post方法,再将该线程对象添加到消息队列中重复执行。
想要停止线程,调用Handler对象的removeCallbacks(Runnable r)从 线程队列中移除线程对象,使线程停止执行。
3.采用Thread + Handler + post方法
使用post方法将Runnable对象放到Handler的线程队列中,该Runnable的执行其实并未单独开启线程,而是仍然在当前Activity的UI线程中执行,Handler只是调用了Runnable对象的run方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值