0

更新ボタンにリンクされた 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回以上クリックすると、複数のプログレスバーが画面に表示されることです.新しいプログレスバーが同じ位置で古いものを置き換えるだけです..

4

1 に答える 1

0

おそらく、次のような方法で AsyncTask を開始していると思います。

new RefreshTask().execute(params);

その代わりに、アクティビティでインスタンス変数を作成します。これが mTask という名前で、上記のコードを次の呼び出しに置き換えます。

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

このようにして、特定の時間にタスクのインスタンスが 1 つだけ実行されるようにし、ユーザーが新しい更新を開始する前に、更新が完了するまで待機する必要があります。

ユーザーが既存の更新タスクをキャンセルして新しいタスクを実行できるようにする場合は、新しいタスクを開始する前に古いタスクをキャンセルする必要があります。

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

このようにして、古いタスクとその ProgressBar が新しいタスクに適切に置き換えられます。

于 2012-08-27T11:15:19.677 に答える