我有一个应用程序,它从网站读取一些数据,然后为从网站检索到的内容创建TextViews
。我通过AsyncTask
完成了该过程。我已将其设置为如果在尝试从网站读取时出现网络错误,则会显示“重试”按钮。我的代码在第一次运行时运行良好,但是当我尝试从按钮的onClick
运行代码时,我收到以下错误:
java.lang.RuntimeException: An error occured while executing doInBackground()
(a few lines of error code)
Caused by: java.lang.IllegalStateException: The current thread must have a looper!
我甚至试图让onClick
调用外部方法,因为我看到有人推荐,但这没有帮助。以下是一些相关代码:
异步任务
private class DownloadListingTask extends AsyncTask<String, Void, String>{
@Override
protected String doInBackground(String... urls){
showLoadingPage();
try{
return getList(urls[0]);
}
catch (IOException e){
return sharedPreferences.getString("list_cache", "");
}
}
@Override
protected void onPostExecute(String result){
formatList(result);
}
}
致电方法
private void tryDownload(){
DownloadListingTask downloadListingTask = new DownloadListingTask();
downloadListingTask.execute(url);
}
onClick事件
retryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tryDownload();
}
});
因此,当从tryDownload()
调用onCreateView
方法时,它可以正常工作,但是当我从onClick
尝试时,就是当我收到错误时。
答案 0 :(得分:0)
尝试在onPreExecute方法中调用showLoadingPage:
private class DownloadListingTask extends AsyncTask<String, Void, String>{
@Override
protected void onPreExecute(){
showLoadingPage();
}
@Override
protected String doInBackground(String... urls){
try{
return getList(urls[0]);
}
catch (IOException e){
return sharedPreferences.getString("list_cache", "");
}
}
@Override
protected void onPostExecute(String result){
formatList(result);
}
}
答案 1 :(得分:0)
对于那些仍在寻找答案并将RxJava用于异步操作的人,这可能会有所帮助。
在使用Rxjava时,如果未指定 observing 线程,则会出现此错误。
由以下原因引起:java.lang.IllegalStateException:当前线程必须具有循环程序!
所以不要忘记添加
subscribeOn(Schedulers.io())
observeOn(AndroidSchedulers.mainThread())//必需
disposableObserver = Observable.timer(2000, TimeUnit.MICROSECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
//some code
}
});