WEB开发网
开发学院手机开发Android 开发 Android 中的线程模型 阅读

Android 中的线程模型

 2010-04-14 05:07:00 来源:WEB开发网   
核心提示:Android提供了一些方法,能在其它线程中访问UI线程,Android 中的线程模型(2),你可能对其中的一些已经很熟悉了,但这里是一份较为全面的列表:· Activity.runOnUiThread(Runnable)· View.post(Runnable)· View.postDelayed(Runnable,

Android提供了一些方法,能在其它线程中访问UI线程。你可能对其中的一些已经很熟悉了,但这里是一份较为全面的列表:

· Activity.runOnUiThread(Runnable)

· View.post(Runnable)

· View.postDelayed(Runnable, long)

· Handler

你可以使用这些类和方法中的任一来修正上面的例子代码:

public void onClick(View v) {

new Thread(new Runnable() {

public void run() {

final Bitmap b = loadImageFromNetwork();

mImageView.post(new Runnable() {

public void run() {

mImageView.setImageBitmap(b);

}

});

}

}).start();

}

不幸的是,这些类和方法可能会使你的代码变得更加复杂并难以阅读。特别是,当你实现一个复杂的操作,而在这个操作中,需要频繁地更新UI。

为了解决这个问题,Android 1.5和它之后的平台提供了一个通用的类——AsyncTask,其简化了长时间运行任务的创建过程,而这些任务还能做到与UI进行交互。

Android 1.0和1.1上,也有与AsyncTask类似的东西,叫做UserTask。它提供了相同的API,而你需要做的只是拷贝其中的代码。

AsyncTask的目的是帮助你管理线程。我们之前的例子可以很容易用AsyncTask进行改写:

public void onClick(View v) {

new DownloadImageTask().execute("http://example.com/image.png");

}

private class DownloadImageTask extends AsyncTask {

protected Bitmap doInBackground(String... urls) {

return loadImageFromNetwork(urls[0]);

}

protected void onPostExecute(Bitmap result) {

mImageView.setImageBitmap(result);

}

}

如你所见,AsyncTask必须继承使用。此外,还必须记住的是AsyncTask的实例必须在UI线程中创建并只能执行一次。你可以阅读AsyncTask的文档来全面了解如何使用,但这里,只是简要地描述它以及它的工作过程:

· 你可以使用泛型来指定参数、进度值和最终结果的类型

· doInBackground() 方法自动在工作者线程中执行

Tags:Android 线程 模型

编辑录入:coldstar [复制链接] [打 印]
赞助商链接