在Android UI线程上花费大量的计算

我的Android应用程序使用了一个特别大的计算,使系统崩溃,因为它在Activity中的UI线程上。 我对multithreading没有多less信心,所以我想获得一些关于如何正确执行的提示。 这是我的

class ActivtyName extends Activity{ boolean threadcomplete = false; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //stuff Runnable newthread = new Runnable(){ @Override public void run() { doBigComputation(); threadcomplete=true; } }; newthread.run(); boolean b = true; while(b){ if(threadcomplete){ b=false; startTheApp(); } } } } 

现在,我很确定我所做的不是“正确的”。 (这似乎工作,系统不会崩溃)。 基本上,我不知道如何可以告诉UI线程没有这个布尔,线程完成newthread已经完成计算。 有没有一个“正确”的方式来做到这一点?

Solutions Collecting From Web of "在Android UI线程上花费大量的计算"

只是为了扩大Marek Sebera的评论,这里是关于如何在AsyncTask中实现的框架。

 private class BigComputationTask extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { // Runs on UI thread Log.d(TAG, "About to start..."); } @Override protected Void doInBackground(Void... params) { // Runs on the background thread doBigComputation(); } @Override protected void onPostExecute(Void res) { // Runs on the UI thread Log.d(TAG, "Big computation finished"); startTheApp(); } } 

并称之为:

 BigComputationTask t = new BigComputationTask(); t.execute(); 

除了Marvin的回答之外, Android开发者网站上还有一篇关于这方面的文章 。

这不是启动线程的正确方法。 你需要做的是:

  Runnable newthread = new Runnable(){ @Override public void run() { doBigComputation(); threadcomplete=true; } }; Thread t = new Thread(newthread); newthread.start(); boolean b = true; while(b){ if(threadcomplete){ b=false; startTheApp(); } } 

当我想使用线程时,我几乎有一个很大的while循环。 我把布尔条件永远是真实的,除非我想停止它。

我使用线程(http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html),我重新实现停止方法,因为它已被弃用&#x3002; 所以在我的停止方法,我可以把一个错误的值的循环variables。

要终止线程,我使用t.stop()。 所以你可以在你的活动中做到这一点。

如果你想知道什么时候停止,你可以使用t.isAlive()。 如果线程t启动,isAlive将返回true。