1

loadMoreという名前のAsyncTaskを、LOADMOREという名前のボタンを介してループトリガーで何度も実行したいと思います。

エラー:

03-07 20:31:38.330:E / AndroidRuntime(504):java.lang.IllegalStateException:タスクを実行できません:タスクはすでに実行されています(タスクは1回だけ実行できます)

試してみました

  • ボタンLOADMOREは、loadMoreの場合onPostExecute()にのみ表示されます-AsyncTaskが実行されます。内にLOADMOREビューを追加しますonPostExecute()
  • AsyncTaskの想定される動作は、LOADMOREボタンを介して表示されません。
  • AysncTask --loadMoreRUNNINGかどうかを確認しますか?onClickListenerLOADMOREボタンの内側。
  • ただし、情報をログに記録するためonClickListener、LOADMOREボタンに到達することはありません。

LOADMOREボタンのonClickListenerコード::

 ld. . . . . .loadMore AsyncTask.
 ll. . . . . . LinearLayout (where I'm removing and Adding LOADMORE button).
 loadMore. . . LOADMORE Button.

public void onClick(View v) {
        // TODO Auto-generated method stub
        ll.removeView(loadMore);
        //loadMore.setVisibility(View.INVISIBLE);
        spin2.setVisibility(View.VISIBLE);
        if(ld.getStatus()==Status.PENDING)
        {
            ld.execute();
            Log.i("PENDING", "Not yet RUNNING");
        }
        else if(true)
        {
            while(ld.getStatus()==Status.RUNNING)
            {
                Log.i("loadMore Async", "LoadMore RUNNING");
                if(ld.getStatus()==Status.FINISHED)
                    return;
            }
            ld.execute();
        }

    }

loadMore AsyncTaskのonPostExecute()::

protected void onPostExecute(Void result) {
adapter = new PhotosAdapter(MainActivity.this, arrPhotos);
        gridOfPhotos.setAdapter(adapter);

        spin2.setVisibility(View.GONE);

        ll.addView(loadMore);
        Log.i("loadMore-Async", "Adding LoadMore button again");
        Log.i("loadMore-Async", "LoadMore AsyncTask onPost() finished");
        loadMore.setOnClickListener(n);
        Log.i("loadMore-Async", "Adding Listener to LoadMore");
    }
4

2 に答える 2

0

AsyncTaskを2回実行することはできません。ドキュメント「タスクは1回だけ実行できます(2回目の実行が試行されると例外がスローされます)」から引用して、リンクhttp://developer.android.com/reference/android/os/AsyncTask.html

新しいタスクを作成して実行する以外に他のオプションはありません。

于 2013-03-07T15:43:35.110 に答える
0

達成した

  • 動的にインスタンス化される新しいAsyncTaskを作成します。
  • 新しいAysncTaskの作成のループは、loadMoreAsyncTaskの配列を作成することで解決されます。

コード::

loadMorePhotos[] lmd=new loadMorePhotos[1000];

LOADMOREボタンのonClickListener::

    View.OnClickListener n=new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        ll.removeView(loadMore);
        //loadMore.setVisibility(View.INVISIBLE);
        spin2.setVisibility(View.VISIBLE);
        if(ld.getStatus()==Status.PENDING)
        {
            ld.execute();
            Log.i("loadMoreAsync", "new AsyncTask : 0");
            Log.i("PENDING", "Not yet RUNNING");
        }
        else if(true)
        {
             Log.i("loadMoreAsync", "Creating new AsyncTask");
             lmd[j]=new loadMorePhotos();
             lmd[j].execute();
             Log.i("loadMoreAsync", "Creating LoadMore AsyncTask :"+j);
             j++;

        }

    }
};
于 2013-03-07T17:36:35.613 に答える