Android 线程模型 Painless Threading
2010-02-08 03:01:00 来源:WEB开发网Activity.runOnUiThread( Runnable )
View.post( Runnable )
View.postDelayed( Runnable, long )
Hanlder
上面的任何一个类或方法都可以修复我们前面代码中出现的问题。
Java代码
public void onClick( View v ) {
new Thread( new Runnable() {
public void run() {
final Bitmap b = loadImageFromNetwork();
mImageView.post( new Runnable() {
mImageView.setImageBitmap( b );
});
}
}).start();
}
很不幸的是这些类或方法同样会使你的代码很复杂很难理解。然而当你需要实现一些很复杂的操作并需要频繁地更新UI时这会变得更糟糕。为了解决这个问题,Android 1.5提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单。
在Android 1.0和1.1中具有与AsyncTask相同功能的类UserTask。它提供了完全一样的API,你需要做的只是把它的代码拷贝的你的程序中。
AsyncTask的目标是替你管理你的线程。前面的代码可以很容易地使用AsyncTask重写。
Java代码
public void onClick( View v ) {
new DownloadImageTask().execute( "http://example.com/image.png" );
}
private class DownloadImageTask extends AsyncTask {
protected Bitmap doInBackground( String... urls ) {
return loadImageFormNetwork( urls[0] );
}
protected void onPostExecute( Bitmap result ) {
mImageView.setImageBitmap( result );
}
}
正如你看到的,使用AsyncTask必须要继承它。使用AsyncTask非常重要的是:AsyncTask的实例必须在UI线程中创建而且只能被使用一次。你可以使用预读AsyncTask的文档来来了解如何使用这个类,下面大概地了解一下它是如何工作的:
你可以使用泛型参数制定任务的参数、中间值(progress values)和任何的最终执行结果
doInBackground()方法会自动地在工作者线程中执行
onPreExecute()、onPostExecute()和onProgressUpdate()方法会在UI线程中被调用
doInBackground()方法的返回值会被传递给onPostExecute()方法
更多精彩
赞助商链接