脚本在一个间隔中触发长时间运行的操作会导致应用程序崩溃

时间:2018-05-08 21:09:30

标签: java android multithreading

为什么此代码会使应用程序崩溃并迫使我关闭它?

public class ThreadE extends Activity implements OnClickListener {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Button button = new Button(this);
        button.setText("Do Time Consuming task!");
        setContentView(button);
        button.setOnClickListener(this);}
        public void onClick(View v) {
        try {
            for(int i=0; i<10; i++) {
                System.out.println(i);
                Thread.sleep(10000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

3 个答案:

答案 0 :(得分:1)

你需要一个单独的线程。

像这样的东西

public class ThreadEActivity extends Activity implements OnClickListener, Runnable {

 private boolean running = false;

 @Override
 public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   Button button = new Button(this);
   button.setText("Do Time Consuming task!");
   setContentView(button);
   button.setOnClickListener(this);
}

@Override
public void onClick(View v) {
 if (!running) { // prevent many threads when click repeats
   new Thread(this).start();  // Start the run method
 }
} 

@Override
public void run() {
 this.running = true;
 try {
   for(int i=0; i<10; i++) {
     System.out.println(i);
     Thread.sleep(10000);
   }
 } catch (InterruptedException e) {
   e.printStackTrace();
 }
 running = false;
}
}

答案 1 :(得分:0)

此类正在扩展Activity - 这意味着它将位于Main / UI线程上。你正在调用Thread.sleep(10000),它阻塞主线程10秒。对于Android来说这是不好的做法,因为你永远不应该阻止主线程。尝试继承Thread或AsyncTask以获得更好的结果

答案 2 :(得分:0)

系统可能会杀死无响应的活动。我并没有真正看到这一点&#34;测试&#34;。耗时的东西也不应该在主线程中运行。