异步任务未连续运行

时间:2018-02-08 06:47:40

标签: android android-asynctask

我有一个异步任务 twitter api 检索数据,一个侦听器在异步任务完成后运行,任何人都可以告诉我为什么异步任务只运行一次?即它只返回光标一次,我尝试使用do while循环来包围异步任务,它只是在无限循环中运行。 (当光标值为0时,它应该停止,起始值为-1)。

以下是我使用异步任务

调用方法的地方
loadTwitterFriends(new cursorListener(){
        @Override
        public void onFollowReceived(long cursor) {
            if(cursor == 0) {
                //Toast.makeText(getActivity(), String.valueOf(cursor),Toast.LENGTH_LONG).show();
                adapter.notifyDataSetChanged();
            }
            else{
                Log.e("Cursor failure", String.valueOf(getCursor()));
            }
        }
    });

使用异步任务的方法

private void loadTwitterFriends(final cursorListener listener) {
    MyTwitterApiClient myTwitterApiClient = new MyTwitterApiClient(twitterSession);
        myTwitterApiClient.getCustomTwitterService().list(loggedUserTwitterId, getCursor()).enqueue(new retrofit2.Callback<FriendsResponseModel>() {
            @Override
            public void onResponse(Call<FriendsResponseModel> call, Response<FriendsResponseModel> response) {
                Log.e("onResponselol", response.toString());
                twitterFriends = fetchResults(response);
                getActivity().setTitle(String.valueOf(twitterFriends.size()) + " Following");


                setCursor(fetchResults3(response));
                Log.e("onResponseFlwing", "Cursor:" + getCursor());


                Log.e("onResponse", "twitterfriends:" + twitterFriends.size());




                //adapter.notifyDataSetChanged();
                if (getCursor() == 0){
                    listener.onFollowReceived(getCursor());
                    return;
                }
            }

            @Override
            public void onFailure(Call<FriendsResponseModel> call, Throwable t) {
                listener.onFollowReceived(1);
                Log.e("onFailure", t.toString());
            }

        });
}

private List<TwitterFriends> fetchResults(Response<FriendsResponseModel> response) {
    FriendsResponseModel responseModel = response.body();
    return responseModel.getResults();
}
private long fetchResults3(Response<FriendsResponseModel> response) {
    FriendsResponseModel responseModel = response.body();
    Log.e("lol",String.valueOf(responseModel.getNextCursor()));
    return responseModel.getNextCursor();
}

1 个答案:

答案 0 :(得分:0)

那是因为AsyncTasks设计得像那样

来自官方documentation

  

任务只能执行一次(如果是,则会抛出异常   尝试第二次执行。)

因此,如果您需要循环,则应每次创建新的AsyncTask

实际上AsyncTask基于简单的java ThreadThread cannot be started twice too

  

不止一次启动线程永远不合法。特别是,a   一旦完成执行,线程可能无法重新启动。

如果开始两次,它会抛出IllegalThreadStateException

顺便说一句,我们无法启动Thread两次,因为它存在很多问题,例如:

  • 如果线程启动两次,我们有2个线程使用1个runnable对象,所以我们有很大的并发问题。
  • 第二次启动后,哪个线程id将拥有线程对象