从Android UI线程中获取大量计算

时间:2012-01-01 15:21:26

标签: java android multithreading runnable heavy-computation

我的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();
            }
        }

}
}

现在,我很确定我所做的并不是“正确”。 (它似乎工作。这个系统不会崩溃)。基本上,我不确定如何在没有此布尔值,threadcomplete的情况下告诉UI线程newthread已完成计算。有没有“正确”的方法来做到这一点?

4 个答案:

答案 0 :(得分: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();

答案 1 :(得分:2)

除了马文的回答之外,还有一个good article on the Android developer site正是这个。

答案 2 :(得分: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();
        }
    }

答案 3 :(得分:-2)

当我想使用线程时,我几乎是一个很长的循环。我设置了一个总是正确的布尔条件,除非我想要阻止它。

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

要终止线程,我使用t.stop()。所以你可以在你的活动中加入。

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