7

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

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 在没有这个布尔线程完成的情况下完成了计算。有没有“正确”的方法来做到这一点?

4

4 回答 4

12

只是为了扩展一下 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();
于 2012-01-01T15:41:41.703 回答
2

除了 Marvin 的回答之外,Android 开发者网站上还有一篇很好的文章正是关于这一点的。

于 2012-01-01T16:22:18.370 回答
1

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

    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();
        }
    }
于 2012-01-01T21:22:50.160 回答
-2

当我想使用线程时,我几乎有一个很大的 while 循环。我放置了一个始终为真的布尔条件,除非我想停止它。

我使用 Thread (http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html) 并重新实现 stop 方法,因为它已被弃用。所以在我的停止方法中,我可以给循环变量设置一个假值。

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

如果您想知道 Thead 何时停止,可以使用 t.isAlive()。如果线程 t 启动,isAlive 将返回 true。

于 2012-01-01T15:28:10.173 回答