我的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已完成计算。有没有“正确”的方法来做到这一点?
答案 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。