Android Java GUI冻结/ w ProgressBar

时间:2016-07-12 17:15:05

标签: java android user-interface progress-bar freeze

我最近开始学习JAVA / Android并发现了一些有趣的东西。我想制作一个应用程序,顺便说一下,但是我有一个小问题。我做了一个有很多操作的应用程序。如此多的GUI冻结(PC /智能手机)。例如,我有一段时间有10000个时期,其中有许多使用fors的函数(进化算法)。我正在使用ProgressBar。问题是当我启动应用程序时,进度条会冻结。我可以告诉你应用程序的样子

Evolutionary

如您所见,有一个按钮。我用这个按钮启动整个事情。所以问题是,有没有办法使progresbar工作?我只想让进度条显示实际时期和最大时期作为最终值。 我试图创建一个帖子,但没有工作,我也尝试了委托,但也没有工作。

感谢您的帮助。

1 个答案:

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