【问题标题】:ProgressBar multiple displayingProgressBar 多重显示
【发布时间】:2012-08-25 15:56:51
【问题描述】:

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

我的 Layout 上有一个用于 ProgressBar 的 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 在同一位置替换旧的 ..

【问题讨论】:

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


    【解决方案1】:

    我的猜测是您可能以类似于以下方式启动 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 将被新任务正确替换。

    【讨论】:

    • 感谢您的支持,我也解决了这个问题,并且工作正常。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2016-01-09
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多