一、解决新线程无法更新UI组建问题的方案
1.使用Handler实现线程之间的通信。
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
//操作界面
myText.setText( 来自网络的信息);
super.handleMessage(msg);
}
};
public class MyThread extends Thread {
public void run() {
// 耗时操作
loadNetWork();
Message msg = new Message();
mHandler.sendMessage(msg);//向Handler发送消息,
}
}
2.Activity.runOnUiThread(Runnable)。
public void onClick( View v ) {
new Thread( new Runnable() {
public void run() {
// 耗时操作
loadNetWork();
Activity.runOnUiThread.( new Runnable() {
myText.setText( 来自网络的信息);
});
}
}).start();
}
3.View.post(Runnable)。
public void onClick( View v ) {
new Thread( new Runnable() {
public void run() {
// 耗时操作
loadNetWork();
myText.post( new Runnable() {
myText.setText( 来自网络的信息);
});
}
}).start();
}
4.View.postDelayed(Runnable)。
二、AsyncTask抽象类
AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承,继承AsyncTask需要指定如下三个泛型参数:
Params:启动任务执行的输入参数的类型。
Progress:后台任务完成进度值的类型。
Result:后台执行任务完成后返回结果的类型。
//UI线程中执行
new DownloadImageTask().execute( "www.91dota.com" );
private class LoadTask extends AsyncTask {
protected String doInBackground( String... url ) {
return loadDataFormNetwork( url[0] );//后台耗时操作
}
protected void onPostExecute( String result ) {
myText.setText( result ); //得到来自网络的信息刷新页面
}
三、AsyncTask的特点
更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可。
四、使用AsyncTask的步骤
1.创建AsyncTask的子类,并为三个泛型参数指定类型。如果某个泛型参数不需要指定类型,可将它指定为void。
2.根据需要,实现AsyncTask的如下方法:
doInBackground(Params …):后台线程将要完成的任务,可以调用publishProgress(Progress... values)方法更新任务执行进度。
onProgressUpdate(Progress... values):在doInBackground()方法中调用publishProgress()方法更新任务的执行进度后,就会触发该方法。
onPreExecute():执行后台耗时操作前被调用,通常用户完成一些初始化操作,比如在界面上显示进度条。
onPostExecute(Result result):当doInBackground()完成后,系统会自动调用onPostExecute()方法,并将doInBackground方法返回的值传给该方法。
3.调用AsyncTask子类的实例的execute(Params... params)开始执行耗时任务。
五、使用AsyncTask时必须遵守的规则
必须在UI线程中创建AsyncTask的实例。
必须在UI线程中调用AsyncTask的execute()方法。
AsyncTask的onPreExecute()、onPostExecute(Result result)、doInBackground(Params... params)、onProgressUpdate(Progress... values)方法,不应该由程序员代码调用,而是由Android系统负责调用。
每个AsyncTask只能被执行一次,多次调用将会引发异常。
帮助理解:
http://blog.csdn.net/zkdemon/article/details/6914161
http://blog.csdn.net/fenghome/article/details/5675421