android开发之异步任务和AsyncDataLoader,带你看源码

原创 2015年07月07日 17:59:11

平时我们喜欢用各种框架和异步任务handler来更新UI,但是从来没明白为什么,只是不停的抄袭,今天我就来深刻的理解一下什么叫异步任务,什么叫Handler,以及用了N次的AsyncDataLoader的用法。

一、异步任务(AsyncTask 【ps:换行加>代表涂灰段落】)
师父说,异步任务的本质是一个线程池,然后异步任务中可以更新UI的onPostExecute方法其内部调用的handler去更新的UI,也就是说,异步任务并不是更新UI的方式,它也只是调用了别人的方法也就是handler来更新UI,也就是说更新UI的方式是Handler和runOnUiThread。

异步任务源码解释(ps:一个冒号加一个中文空格区分小标题)
public class TestActivity extends ActionBarActivity {
private TextView test;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_test);
test=(TextView)findViewById(R.id.mytext);
Map<String,String> map = new HashMap<String,String>();
map.put("grant_type","client_credential");
map.put("appid","wx9103cb43ba8c9001");
map.put("secret","052ee3aceae62507bb4bbe2bd5c55a75");
new ZyAsyncTask(test).execute(map);

}


    // Map<String,String>代表doInBackground方法的参数类,
,Integer代表刷新进度条的类型
 //String代表耗时操作返回的类型或者说是耗时结束得到的数据类型onPostExecute,就像这里请求服务端返回的是String类型一样
    class ZyAsyncTask extends AsyncTask<Map<String,String> , Integer, String>{
        String url="https://api.weixin.qq.com/cgi-bin/token";
       // TextView test;
        //t为要更新的UI对象,貌似可以不用传过来
        ZyAsyncTask( TextView t){
       //    test=t;
            Log.e("测试", "ZyAsyncTask( TextView t)");
        }
        //执行费时操作
        @Override
        protected String doInBackground(Map<String,String>... Xparams) {
            Log.e("测试","doInBackground(Map<String,String>... Xparams)");
            HttpPost http=new HttpPost(url);
            List<NameValuePair> mparams = new ArrayList<NameValuePair>();
            mparams.clear();
            Set<String> set = Xparams[0].keySet() ;
            for(String strset : set) {
                mparams.add(new BasicNameValuePair(strset, Xparams[0].get(strset)));
            }
            try{
                http.setEntity(new UrlEncodedFormEntity(mparams, HTTP.UTF_8));
                HttpResponse httpResponse = new DefaultHttpClient().execute(http);
                if (httpResponse.getStatusLine().getStatusCode() == 200) {
                    String result = EntityUtils.toString(httpResponse.getEntity());
                    System.out.println(result);
                    return result ;
                }
            }catch (Exception e){
                e.printStackTrace();
            }

            return null;
        }

        //刚启动准备阶段
        @Override
        protected void onPreExecute() {
            Log.e("测试","onPreExecute()");

            test.setText("准备阶段");
        }
        //耗时操作完成后做UI更新在这里
        @Override
        protected void onPostExecute(String result) {
            Log.e("测试","onPostExecute(String result)");
            test.setText(result);
        }

        //更新进度条
        @Override
        protected void onProgressUpdate(Integer[] values) {
            Log.e("测试","onProgressUpdate(Integer[] values)");
            test.setText(values[0]+"");
        }
        //取消异步任务
        @Override
        protected void onCancelled(String result) {
            Log.e("测试","onCancelled(String result)");
            test.setText(result);
        }
    }
}
:   以上方法中打印依次顺序为 ZyAsyncTask( TextView t)---> onPreExecute()---> doInBackground(Map<String,String>... Xparams)--->
onPostExecute(String result),要是平时的使用就是这样子的了,可是师父说它更新ui的方法调用了handler,接下来看源码:
然而依然看不出调用了handler

这个是异步任务的源码
*平时从来不看源码的,以至于各种抄袭然后啥也不知道,希望这次修行能有所获。第一次认真看源码,翻译文在这里,由于原文太庞大了,就另写了一篇文章。地址:
http://blog.csdn.net/u013200864/article/details/46801887

上面的源码翻译很乱,但用心看不难发现异步任务就是个一个子线程,n内部使用了线程池,并不能更新UI,只是它内部调用了handler,因而可以在onPostExecute和onPreExecute方法中刷新UI,下面介绍handler.
二、Handler(子线程刷新UI的方式)
Handler
用法如下:

runOnUiThread

三、AsyncDataLoader工具类

public class AsyncDataLoader extends AsyncTask<Void, Long, Object> {

    private Callback mCallback;

    public AsyncDataLoader(Callback callback) {
        setCallback(callback);
    }

    protected Object doInBackground(Void... voids) {
        if (mCallback != null) {
            mCallback.onStart();
        }
        return null;
    }
    protected void onPostExecute(Object result) {
        super.onPostExecute(result);
        if (mCallback != null) {
            mCallback.onFinish();
        }
    }


    protected void onPreExecute() {
        super.onPreExecute();
        if (mCallback != null) {
            mCallback.onPrepare();
        }
    }

    public void setCallback(Callback callback) {
        this.mCallback = callback;
    }

    public interface Callback {
        public void onPrepare();

        public void onStart();

        public void onFinish();
    }



}
版权声明:本文为博主原创文章,未经博主允许不得转载。

带你轻松看源码---AsyncTask(异步任务)

前言 导读 串行和并行的概念 Android的消息机制Handler的原理 队列的概念容器ArrayDeque的使用 AsyncTask的内部模块图 前言: 本篇文章主要...

[Android开发常见问题-23] Android Handler、Message完全解析,带你从源码的角度彻底理解

我们都知道,Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃。相信大家在日常的工作当中都会经常遇到这个问题,解决的方案应该也是早已烂熟于心,即创建一个Messag...

Android异步任务AsyncTask实例源码

  • 2016年12月27日 10:53
  • 26.27MB
  • 下载

Android异步消息处理机制,从源码带你来解析

首先呢,很多的博客都分析了Android的异步消息处理机制,我看了他们的分析之后,决定把自己所理解的也记录下来。 开始进入正题,大家都知道Android 的异步消息处理机制,并且大多数人都用来更新U...

Android异步消息处理机制完全解析,带你从源码的角度彻底理解

之前也是由于周末通宵看TI3比赛,一直没找到时间写博客,导致已经有好久没更新了。惭愧!后面还会恢复进度,尽量保证每周都写吧。这里也是先恭喜一下来自瑞典的Alliance战队夺得了TI3的冠军,希望明年...

带你从源码看Android Handler 异步消息处理机制完全解析

带你从源码看Android Handler 异步消息处理机制完全解析android studio 2.2.2 SDK版本 25.0.3 在2.2.2的版本中修改代码调试 真的是超级快,特别爽 两...

【 Android】handler异步消息处理机制完全解析,带你从源码的角度彻底理解

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9991569 之前也是由于周末通宵看TI3比赛,一直没找到时间写博客,导致...

Android异步消息处理机制完全解析,带你从源码的角度彻底理解

 转载于:http://blog.csdn.net/guolin_blog/article/details/9991569 开始进入正题,我们都知道,Android UI是线程不安全的,如果在...
  • yan8024
  • yan8024
  • 2015年08月25日 16:00
  • 524

【转】Android异步消息处理机制完全解析,带你从源码的角度彻底理解

出处:http://blog.csdn.net/guolin_blog/article/details/9991569 之前也是由于周末通宵看TI3比赛,一直没找到时间写博客,导致已经有好久...

Android异步消息处理机制完全解析,带你从源码的角度彻底理解

Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃。相信大家在日常的工作当中都会经常遇到这个问题,解决的方案应该也是早已烂熟于心,即创建一个Message对象,然后...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android开发之异步任务和AsyncDataLoader,带你看源码
举报原因:
原因补充:

(最多只允许输入30个字)