Java 将繁重的计算从Android UI线程中移除
我的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
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();
}
}