我有一个异步任务从 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();
}
答案 0 :(得分:0)
那是因为AsyncTasks
设计得像那样
来自官方documentation:
任务只能执行一次(如果是,则会抛出异常 尝试第二次执行。)
因此,如果您需要循环,则应每次创建新的AsyncTask
。
实际上AsyncTask
基于简单的java Thread
和Thread
cannot be started twice too:
不止一次启动线程永远不合法。特别是,a 一旦完成执行,线程可能无法重新启动。
如果开始两次,它会抛出IllegalThreadStateException
顺便说一句,我们无法启动Thread两次,因为它存在很多问题,例如: