ProgressBar多次显示

时间:2012-08-25 15:56:51

标签: android-asynctask progress-bar android-progressbar

我有一个链接到刷新按钮的AsyncTask(当我点击我的刷新按钮时,我的AsyncTask被调用)。

我在我的布局上有一个ProgressBay的LinearLayout字段:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="@color/grey">
     <Button    android:id="@+id/refresh_p"
                android:text="@string/refresh_promo"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/custom_button1"/>

   <LinearLayout android:id="@+id/linearlayoutProgressBar"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center"/>
   <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:listSelector="@color/tabTransparent"
        android:cacheColorHint="#00000000"/>
      <!--   <ListView android:id="@+id/list_promo"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"/>-->
</LinearLayout>

在我的AsyncTask中:

@Override
    protected void onPreExecute() 
    {
        super.onPreExecute();

        pb = new ProgressBar(context);
        LinearLayout ll = (LinearLayout) ((Activity) context).findViewById(R.id.linearlayoutProgressBar);
        ll.addView(pb);
        pb.setVisibility(View.VISIBLE);
    }

    @Override
    protected void onPostExecute(ArrayList<HashMap<String, String>> promoList) 
    {
        ...

        if (pb!=null) 
        {
            pb.setVisibility(View.GONE);
            ((LinearLayout)pb.getParent()).removeView(pb);
        }
    }

我遇到的问题是当我在刷新按钮上点击超过2次,然后多个ProgressBar显示在屏幕上..我只是想让新的ProgressBar替换旧的相同位置..

1 个答案:

答案 0 :(得分:0)

我的猜测是你可能以类似的方式开始你的AsyncTask:

new RefreshTask().execute(params);

而不是在您的活动中创建一个实例变量。假设这被命名为mTask并用以上代码替换以下调用:

if(mTask != null && mTask.getState != AsyncTask.State.RUNNING){
    mTask = new RefreshTask();
    mTask.execute(params);
}

这样,您将确保在给定时间只有一个任务实例正在运行,并且用户必须等到刷新完成才能开始新的刷新。

如果您希望用户能够取消现有刷新任务并运行新任务,则必须在开始新任务之前取消旧任务:

if(mTask != null){
    if(mTask.getStatus() == AsyncTask.Status.RUNNING){
         mTask.cancel(true);
    }
    mTask = new RefreshTask();
    mTask.execute(params);
}

这样,旧任务及其ProgressBar将被新任务正确替换。