Java 如何运行循环而不冻结我的应用程序?

Java 如何运行循环而不冻结我的应用程序?,java,android,multithreading,for-loop,Java,Android,Multithreading,For Loop,循环冻结了我的应用程序,但在它完成后,应用程序正常工作。我试着在线程中运行循环,它在不冻结应用程序的情况下运行得非常好。但现在的问题是,如果应用程序崩溃,我不能再次运行相同的循环,因为我们无法重新启动线程。我想运行循环的方式,它不会冻结应用程序,可以再次运行。我怎么做 myMainActivityclass中的代码: protected Thread sendthread; @Override protected void onCreate(Bundle savedInstanceState)

循环冻结了我的应用程序,但在它完成后,应用程序正常工作。我试着在
线程中运行循环,它在不冻结应用程序的情况下运行得非常好。但现在的问题是,如果应用程序崩溃,我不能再次运行相同的循环,因为我们无法重新启动
线程
。我想运行循环的方式,它不会冻结应用程序,可以再次运行。我怎么做

myMainActivityclass中的代码:

protected Thread sendthread;

@Override
protected void onCreate(Bundle savedInstanceState) {

 sendthread = new Thread(new Runnable () {

    @Override
    public void run() {

  for(int i=0;i<amount;i++){

            if  (status == 0){

                break;  

            }

             SmsManager sms = SmsManager.getDefault();
      sms.sendTextMessage(phoneNumber.getText().toString(),null,messagetoSend, null, null);

    }

    }
});


}

我通过将
状态设置为
0
来停止线程。维护一个布尔变量来控制内部循环,并维护一个外部无限循环来停止线程终止。

尝试使用
异步任务。在
onPreExecute
函数中启动一个进度条,并在
onPostExecute
中调用
cancel
。在
doInBackground
内部,您可以调用sleep。这不会使你的应用程序崩溃,你也不会觉得应用程序没有响应。

创建一个Runnable,其中的代码将在其run方法中循环。然后使第二个Runnable发布到UI线程

 Runnable myRunnable = new Runnable() {
     @Override
 public void run() {
       while (testByte == 0) {
            Thread.sleep(1000); // 1 Second delay
            String updateWords = updateAuto(); // make updateAuto() return a string
            myTextView.post(new Runnable() { 
                 @Override
                 public void run() {
                      myTextView.setText(updateWords);
                 });
       }
}
之后,您可以使用Runnable创建线程并启动它 像这样:


要循环多少次就调用多少次该方法

private void loopInAnotherThread() {
   new Thread(new Runnable() {
       public void run() {
           // Your loop
       }
   }).start();
}

为每个循环创建新线程。创建一个
ExecutorService
并在那里运行大量循环。您可以使用AsyncTask如果您的循环只执行几秒钟(最多4秒),则可以使用AsyncTask。我尝试了AsyncTask,但没有任何帮助,仍然冻结它可能会持续4秒以上,具体取决于用户输入谢谢@ShahbazTalpur在这种情况下,每次用户按下按钮时创建一个新线程可能会起作用,但一般来说,对于程序来说,为它希望在后台执行的每个任务创建一个新线程是一个坏主意。创建和销毁线程是昂贵的。使用
AsyncTask
(正如Balu-SKT所建议的)或线程池(例如
ThreadPoolExecutor
)将是一个更好的主意。)
Thread myThread = new Thread(myRunnable);
myThread.start();
private void loopInAnotherThread() {
   new Thread(new Runnable() {
       public void run() {
           // Your loop
       }
   }).start();
}