我最近开始学习JAVA / Android并发现了一些有趣的东西。我想制作一个应用程序,顺便说一下,但是我有一个小问题。我做了一个有很多操作的应用程序。如此多的GUI冻结(PC /智能手机)。例如,我有一段时间有10000个时期,其中有许多使用fors的函数(进化算法)。我正在使用ProgressBar。问题是当我启动应用程序时,进度条会冻结。我可以告诉你应用程序的样子
如您所见,有一个按钮。我用这个按钮启动整个事情。所以问题是,有没有办法使progresbar工作?我只想让进度条显示实际时期和最大时期作为最终值。 我试图创建一个帖子,但没有工作,我也尝试了委托,但也没有工作。
感谢您的帮助。
答案 0 :(得分:3)
使用AsyncTask。当您在UI线程中长时间运行任务时,线程块和线程将无法更新UI,因此您将看到进度条未增加或加载。那么使用AsyncTask或Thread Pool Executor
在后台线程中执行长时间运行的任务package com.test;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.Settings.System;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.view.View.OnClickListener;
public class AsyncTaskActivity extends Activity {
Button btn;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener((OnClickListener) this);
}
public void onClick(View view){
new LongOperation().execute("");
}
private class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
for(int i=0;i<5;i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPostExecute(String result) {
TextView txt = (TextView) findViewById(R.id.output);
txt.setText("Executed");
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
}