Android 系列 4.9使用线程创建响应式应用程序

来源:互联网 发布:网上淘宝代购店 编辑:程序博客网 时间:2024/05/17 23:19
4.9使用线程创建响应式应用程序
问题
您有一个执行长任务的应用程序,并且您不希望应用程序在这些应用程序正在进行时显示为无响应。

通过使用线程,您可以创建一个响应的应用程序,即使它正在处理耗时的操作。
讨论
为了使您的应用程序响应,而在Android操作系统上运行耗时的操作,您有几个选项。如果你已经知道Java,你知道你可以创建一个类来扩展Thread类,并覆盖public void run()方法,然后在该对象上调用start()方法来运行这个耗时的过程。如果你的类已经扩展了另一个类,你可以实现Runnable接口。另一种方法是创建自己的类来扩展Android的AsyncTask类,但我们将在Recipe 4.10中讨论AsyncTask。
在Java和Android的早期,我们被教导有关直接使用Thread
类。该模式编码如下:
Thread thread = new Thread(new Runnable(){//已弃用,不要使用!
public void run(){
getServerData();
}}
});
thread.start();
关于这种线程的使用有很多问题,但是最大的打击是创建线程的开销。对于除了最简单的情况之外的所有情况,现在建议使用线程池,在其一生的一半时间内都使用Java。
示例4-15显示了此类的基于池的实现。
实例4-15。联网活动实施

public class NetworkConnection extends Activity {ExecutorService pool = Executors.newSingleThreadExecutor();/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);pool.submit(new Runnable(){public void run() {getServerData();}});}}


如你所见,当我们在onCreate()方法中启动我们的活动时,我们创建并提交一个Runnable对象。 Runnable方法run()将在我们在池上调用submit()方法后执行一段时间。从这里你可以调用另一个方法或几个其他方法和操作是耗时的,否则会阻塞主线程,使你的应用程序看起来无响应。
通常当我们完成线程时,我们得到我们想要呈现给应用程序用户的结果。如果您尝试从您启动的线程更新GUI(而不是主线程),您的应用程序将崩溃。你可以读取错误消息,看到问题实际上是一个线程而不是主UI线程你尝试改变UI在主线程。
在Handler类的帮助下,可以用这样的数据改变UI;参见配方4.11。或者,您可以使用AsyncTask来区分代码(见配方4.10)。
0 0
原创粉丝点击