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
原创粉丝点击