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