Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 分线程运行计算_Android_Multithreading - Fatal编程技术网

Android 分线程运行计算

Android 分线程运行计算,android,multithreading,Android,Multithreading,我试图在一个新线程中运行一个计算,我只是不确定正确的方法。我不确定是否应该使用: private Thread calcThread = new Thread(){ @Override public void run(){ calc(); } }; 然后在我想进行计算或应该进行以下操作时使用calcThread.run() new Thread(new Runnable() { public void run() { calc();

我试图在一个新线程中运行一个计算,我只是不确定正确的方法。我不确定是否应该使用:

private Thread calcThread = new Thread(){
    @Override
    public void run(){
        calc();
    }
};
然后在我想进行计算或应该进行以下操作时使用calcThread.run()

new Thread(new Runnable() {
    public void run() {
      calc();
    }
  }).start();
每当我想计算的时候

哪一个更好,如果有的话

谢谢。

像这样做吧

public class cal extends Thread {
    public void run(){
        calc();
    }
}
cal c = new cal();
c.start();
只需像这样创建这个类的对象

public class cal extends Thread {
    public void run(){
        calc();
    }
}
cal c = new cal();
c.start();

您可以在代码中的任何位置启动线程执行计算。

基本相同。第二个稍微干净一些,IMHO,因为实现接口被广泛认为是比子类化框架类更好的实践。如果在遥远的将来,
Thread.run()
不再是线程入口点,该怎么办?不太可能,我知道…

在Android的后台线程中,最简单的方法是异步任务

AsyncTask将处理在后台线程上运行计算,然后在UI线程上返回结果

   private class DoCalculationTask extends AsyncTask<Void, Void, Void> {

      @Override
      protected Void doInBackground(Void... arg0) {
        calc();
        return null;
      }

      protected void onPostExecute(Void result) {
        // Post results to main thread
      }
    }
私有类DoCalculationTask扩展异步任务{
@凌驾
受保护的Void doInBackground(Void…arg0){
计算();
返回null;
}
受保护的void onPostExecute(void结果){
//将结果发布到主线程
}
}

我将继续并选择此作为我的答案。我必须添加一个处理程序来更新我的UI。我还必须使用.run()而不是.start(),因为它会被多次调用。它现在似乎起作用了。谢谢。如果你选择这个作为你的答案,一定要把洛克斯的答案标记为被接受的答案,这样他就可以得到认可。