Java 将繁重的计算从Android UI线程中移除

Java 将繁重的计算从Android UI线程中移除,java,android,multithreading,runnable,heavy-computation,Java,Android,Multithreading,Runnable,Heavy Computation,我的Android应用程序使用了一个特别大的计算,它不断地破坏系统,因为它在活动的UI线程上。 我对多线程几乎没有信心,因此我想了解一些如何正确执行多线程的技巧。 这就是我所拥有的 class ActivtyName extends Activity{ boolean threadcomplete = false; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSta

我的Android应用程序使用了一个特别大的计算,它不断地破坏系统,因为它在活动的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在没有这个布尔值threadcomplete的情况下完成了计算。有“正确”的方法吗?

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

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

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


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

仅对Marek Sebera的评论进行一点扩展,下面是关于如何在异步任务中完成此任务的框架

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

}

除了马文的答案之外,还有一个关于这一点的答案。

这不是开始线程的正确方法。您需要执行以下操作:

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

看看AsyncTask,使用连接等待线程,不要像现在这样忙着等待。
    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();
        }
    }