Многократное отображение ProgressBar

У меня есть AsyncTask, связанный с кнопкой обновления (когда я нажимаю кнопку обновления, вызывается моя AsyncTask).

У меня есть в моем макете поле LinearLayout для моего ProgressBar:

<?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 заменил старый в той же позиции.


person eento    schedule 25.08.2012    source источник


Ответы (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 будут правильно заменены новой.

person mrPjer    schedule 27.08.2012
comment
Спасибо за поддержку, я тоже решил эту проблему, и все работает нормально. Спасибо - person eento; 27.08.2012