我有以下ASyncTask:
public class RetrieveSearchResultsTask extends AsyncTask<YouTube.Search.List, Void, ArrayList<SearchResult>> {
@Override
protected ArrayList<SearchResult> doInBackground(YouTube.Search.List... searchListByKeywordRequest) {
try {
SearchListResponse response = searchListByKeywordRequest[0].execute();
ArrayList<SearchResult> searchResults = new ArrayList<>();
for(SearchResult sr : response.getItems()){
searchResults.add(sr);
}
return searchResults;
}catch (Exception e){
Log.e("error",e.toString());
}
return null;
}
}
对ASyncTask的调用如下(代码在另一个活动中):
AsyncTask<YouTube.Search.List, Void, ArrayList<SearchResult>> task = new RetrieveSearchResultsTask().execute(searchListByKeywordRequest);
ArrayList<SearchResult> searchResults = task.get();
此ASyncTask正在使用youtube api检索搜索结果。 现在,我第一次搜索它可以正常工作,但是当我再次搜索时,该应用程序卡在以下代码上:
ArrayList<SearchResult> searchResults = task.get();
,屏幕仅变黑,应用停止响应。
如果有人帮助我了解问题所在,我将不胜感激
答案 0 :(得分:0)
AsyncTask实例只能使用一次。
相反,只需像new MyAsyncTask()。execute(“”);那样调用您的任务即可
来自AsyncTask API文档:
线程规则 为了使此类正常工作,必须遵循一些线程规则:
必须在UI线程上创建任务实例。
必须在UI线程上调用execute(Params ...)。
请勿手动调用onPreExecute(),onPostExecute(Result),doInBackground(Params ...),onProgressUpdate(Progress ...)。
该任务只能执行一次(如果尝试第二次执行,则会引发异常。)