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) {
        } 
    } 
}