在另一个线程中显示ProgressBar

时间:2012-04-06 08:43:45

标签: android multithreading progress-bar

有几天有一些问题。 我需要在主线程中做一些东西时显示简单的ProgressBar(不是对话框)... 我认为这是一个非常简单的问题,但我不能这样做,请帮助我。

首先我尝试过简单setVisibility(View.VISIBLE)之前和setVisibility(View.GONE)之后。

但这是在同一个线程中进行的,ProgressBar在我的函数工作时冻结。

现在我有这个代码,但我有一些错误,我不知道什么是错的..

我的简单布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
<ProgressBar
    android:id="@+id/loading"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:visibility="gone" />
</FrameLayout>

我有一个基础活动:

public class BaseActivity extends Activity {
    public ProgressBar loading;

    public class ProgressBarShow extends AsyncTask<Void, Void, Void> {
    protected Void doInBackground(Void... unused) {
        return(null);
    }

    protected void onProgressUpdate() {
    }
    protected void onPreExecute() {
        loading.setVisibility(View.VISIBLE);
    }

    protected void onPostExecute() {
    }
   }
}

最后是我的工作活动,扩展了BaseActivity

public class SearchActivity extends BaseActivity {
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        loading = (ProgressBar) findViewById(R.id.loading);

        new ProgressBarShow().execute();
        //doing long stuff
        //new ProgressBarHide().execute(); there isnt, but sense the same
    }
}

我有很多活动需要进度条,这就是我创建BaseActivity的原因, 不要公开代码。

我需要在主线程中做长时间的工作(东西功能),因为我想冻结主窗口而不允许用户做任何事情(点击按钮等),只显示工作进度条。

我的例子有什么不对?或者给我一些建议我怎样才能做得更好

2 个答案:

答案 0 :(得分:2)

class ProgressTask extends AsyncTask<Integer, Integer, Void>{
    ProgressBar progress;
    Context context;
    public ProgressTask(ProgressBar progress, Context context) {
        this.progress = progress;
        this.context = context;

    }
    @Override
    protected void onPreExecute() {
        // initialize the progress bar
        // set maximum progress to 100.
        progress.setMax(100);

    }


    @Override
    protected Void doInBackground(Integer... params) {
        // get the initial starting value
        int start=params[0];


        // increment the progress
        for(int i=start;i<=100;i+=5){
            try {
                boolean cancelled=isCancelled();
                //if async task is not cancelled, update the progress
                if(!cancelled){
                    publishProgress(i);
                    SystemClock.sleep(1000);

                }

            } catch (Exception e) {
                Log.e("Error", e.toString());
            }

        }
        return null;
    }
    //Has direct connection to UI Main thread
    //Called everytime publishProgress(int) is called in doInBackground
    @Override
    protected void onProgressUpdate(Integer... values) {
        progress.setProgress(values[0]);
        Toast.makeText(context, "test"+values[0], Toast.LENGTH_SHORT).show();
    }


    @Override
    protected void onPostExecute(Void result) {
        // async task finished
                    Log.v("Progress", "Finished");
    }
    @Override
    protected void onCancelled() {
        progress.setMax(0);
    }
}

答案 1 :(得分:0)

使用AsyncTask http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html将ProgressBar放入其中,而所有工作都在主线程中进行