0

这几天有点问题。我需要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,而不是重复代码。

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

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

4

2 回答 2

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);
    }
}
于 2012-04-06T08:52:56.107 回答
0

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

于 2012-04-06T08:55:01.610 回答