Android Java GUI 冻结 /w ProgressBar
Android Java GUI freeze /w ProgressBar
最近开始学习JAVA/Android,发现了一些有趣的东西。我想制作一个应用程序,顺便说一句,效果很好,但我有一个小问题。我做了一个有很多操作的应用程序。太多以至于 GUI 冻结 (PC/Smartphone)。例如,我有一个 while 有 10000 个 epoch,在这个 while 里面有许多使用 fors(进化算法)的函数。我正在使用进度条。问题是当我启动应用程序时进度条冻结。我可以向您展示该应用的外观
如您所见,有一个按钮。我用这个按钮启动整个事情。所以问题是,有什么方法可以让 progresbar 工作吗?我只想让进度条显示实际纪元和最大纪元作为最终值。
我尝试创建一个线程,但没有成功,我也尝试了委托,但都没有成功。
感谢大家的帮助。
使用异步任务。当你在UI线程中执行long 运行任务时,线程阻塞和线程将无法更新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) {
}
}
}
最近开始学习JAVA/Android,发现了一些有趣的东西。我想制作一个应用程序,顺便说一句,效果很好,但我有一个小问题。我做了一个有很多操作的应用程序。太多以至于 GUI 冻结 (PC/Smartphone)。例如,我有一个 while 有 10000 个 epoch,在这个 while 里面有许多使用 fors(进化算法)的函数。我正在使用进度条。问题是当我启动应用程序时进度条冻结。我可以向您展示该应用的外观
如您所见,有一个按钮。我用这个按钮启动整个事情。所以问题是,有什么方法可以让 progresbar 工作吗?我只想让进度条显示实际纪元和最大纪元作为最终值。 我尝试创建一个线程,但没有成功,我也尝试了委托,但都没有成功。
感谢大家的帮助。
使用异步任务。当你在UI线程中执行long 运行任务时,线程阻塞和线程将无法更新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) {
}
}
}