Handle与AsyncTask异步加载数据
来源:互联网 发布:薄膜键盘推荐 知乎 编辑:程序博客网 时间:2024/06/10 04:32
Handle通信的简单使用
Handle是在不同的线程中进行消息传递的一种机制,或者你可以认为是一个能帮你实现这种功能的类。主要用于解决Android中子线程无法更新UI的问题,子线程将需要更新的数据通过Handle传递给UI线程,UI线程做更新,这样就实现了子线程更新UI线程。
注意,本文不会讲Handle的实现原理,不会将AsyncTask的机制框架,只是简单的教你怎么使用它们,如果你已经掌握了它们是如果使用的,这篇文章对你不会有太多的帮助
创建Handle
想要用Handle就少不了要创建一个Handle。不过需要注意的是,每个UI线程,就是那个Activity类,只能创建一个Handle。消息是由哪个Handle发的,在UI线程中就必须要由哪个Handle处理,创建多了会出现找不到消息的情况。所以,如果不是必须,尽量一个Activity只创建一个Handle。创建的代码如下:注意,该类需要实现一个父类的方法,即handleMessage(),这个方法是你获得消息后,需要如何更新UI,是要在该方法内实现的,比如改变一下某个TextView的内容。其中的参数msg,就是你在子线程中要传递的消息。
public Handler mHandle = new Handler(){ @Override public void handleMessage(Message msg) { textView.setText((String)msg.obj); } };
使用Handle
handle的使用是在子线程中使用,这就需要你将创建的handle声明为全局变量。而且在只能创建一个,一定不要在子线程中再创建一个。这样传递的消息在主线程的handle是不会处理的(就是找不到消息,怎处理)。代码如下:新的Thread是你的子线程,数据的更新等耗时操作都可以放到这里来,Message是你需要发送的消息对象,可以通过new创建出来,也可以通过handle的方法创建,两者区别不是太大。但是还是建议使用后者。Message类有两个常用的属性,msg.what,是消息的属性,确定消息的类别,比如网络请求,请求成功what = 200,失败what = 404,这样,在UI中就可以判断,是什么类型的消息,做分别处理。第二个属性是msg.obj,看名字就知道是一个Object对象,如果要传递复杂的消息,比如List,等对象,就可以对该属性赋值,然后在UI线程中强转。就可以使用了。sendMessage(msg)是将消息发送出去。顺便说一下,如果你不需要发送什么消息,仅仅是需要通知下UI线程,可以使用mHandle.sendEmptyMessage(int what);参数是消息类型。
代码如下
public void changeText(){ new Thread(new Runnable() { @Override public void run() { Message msg = mHandle.obtainMessage(); msg.what = 3; msg.obj = "子线程改变"; mHandle.sendMessage(msg); } }).start();}
AsyncTask 简单使用
AsyncTack是一种异步加载机制,一般用在ListView,下拉刷新的ListView,当下拉时,加载的数据可以使用这种机制加载。
Asynctask 的创建
要使用AsyncTask时,需要创建一个类,并继承AsyncTaskAsyncTask<Params, Progress, Result> 。这个类有几个方法需要实现,有在后台加载数据的方法,有在UI中执行更新UI的方法。AsyncTask类有三个泛型,Params是指在后台执行的操作需要参数时的参数类型。Progress是当前后台执行的任务,即加载数据的进度,Result是后台任务执行结束后返回的结果集类型。继承该类后需要实现几个方法,必须要实现一个,根据你需要的功能再实现其他的。doInBackground() 这个是你必须要实现的方法,用于数据加载等耗时操作,该方法不能访问UI线程。该方法在执行完onPreExecute()方法后执行。onPreExecute()该方法是在UI线程中执行的,一般是在执行doInBackground() 前对UI进行的一些操。不是必须要实现的。onPostExecute(Result) 该方法是在UI线程中执行的,是在执行完doInBackground() 方法后执行的,传递的参数是doInBackground() 返回的结果集。onProgressUpdate(Progress) 方法是在UI中执行的,是将后台任务的进度更新到UI中,比如更新进度条之类的。
注意:如果需要使用onProgressUpdate() 方法更新进度,就必须在doInBackground()方法中将进度传递出去,这就要用到publishProgress(Progress)方法,该方法是将当前进度传递出去
忘了说了,如果你不需要这些范型,可以用 Void 代替,对,你没看错,是大写的’V’
代码如下:
public class DownLoadTask extends AsyncTask<String, Integer, String> { /** * 在后台执行的方法,获取资源 * @param params * @return */ @Override protected String doInBackground(String... params) { //在doInBackground对外公布任务进度,类似sendMessage publishProgress(i); } return ""; } /** * 主线程在执行doInBackground方法之前执行的方法 * 该方法在主线程中执行 */ @Override protected void onPreExecute() { super.onPreExecute(); } /** * 主线程在执行doInBackground之后执行该方法 * * @param s doInBackground 方法的返回结果 */ @Override protected void onPostExecute(String s) { super.onPostExecute(s); textView.setText(s); } /** * 用于接收 publishProgress 公布的参数运行在主线程中 * @param values publishProgress 的参数 */ @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } }
AsyncTask使用
AsyncTask的使用非常简单,创建你刚刚创建的那个继承AsyncTask的类对象,然后调用 execute(Params)方法即可
代码如下:
DownLoadTask down = new DownLoadTask(); //如果你的Params是Void就别传参数了 down.execute("www.baidu.com");
Handle与AsyncTask 简单对比
相同点
Handle与AsyncTask 都是为了解决异步加载的问题的。用于将子线程中加载的数据,传递到UI线程中。都是为了在不阻塞UI线程的同时执行其他线程。
Handle
handle使用简单,在处理多个进程的通信,多种消息的处理时优于AsyncTask,容易理解,它是将消息从子线程发送到UI线程中去,在UI线程中做处理。是Android中线程间通信的主流使用方法。
AsyncTask
AsyncTask是一种异步加载的机制,是将数据加载,UI的更新封装到一个类中,然后将这些接口暴露出来,让你去实现。理解起来比较不容易,使用时比较简单,适用与简单的数据加载,在面对多个线程通信时可能有些不足
1 0
- Handle与AsyncTask异步加载数据
- 异步加载数据Thread与AsyncTask比较
- AsyncTask异步加载数据
- AsyncTask异步加载数据
- Android 异步加载数据 AsyncTask
- AsyncTask异步加载数据分析
- AsyncTask异步加载网络数据
- android学习笔记---64_ListView数据异步加载与AsyncTask
- Android学习笔记_36_ListView数据异步加载与AsyncTask
- Android异步加载数据 AsyncTask demo application
- AsyncTask异步任务加载网络数据
- Android:ListView数据异步加载、Handler、AsyncTask
- ProgressBar AsyncTask实现界面数据异步加载
- AsyncTask异步任务加载网络数据
- android AsyncTask与异步加载 博客链接
- Android AsyncTask异步加载
- 异步加载图片AsyncTask
- AsyncTask异步加载图片
- 【剑指offer】二叉树中和为某一值得路径 java
- 怎样发帖发图片
- RxJava 之 响应式编程
- android studio for android learning (二十三 )Android Orientation Sensor(方向传感器)与指南针实战(新方法替代orientation)
- 求最长回文串长度板子
- Handle与AsyncTask异步加载数据
- 的
- CentOS System Administration I
- java GC 日志查看 gcviewer
- 奖学金 灵活的拓扑排序
- 使用Universal-Image-Loader总结的图片加载工具类
- DOC文件中法律法规规程规范对标系统
- Excel2010导出xml格式的
- 【安卓】android Fragment View的缓存以实现重复利用