单击“重试”按钮时,异步错误“当前线程必须有一个活套”

时间:2015-07-04 21:12:54

标签: android android-asynctask

我有一个应用程序,它从网站读取一些数据,然后为从网站检索到的内容创建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尝试时,就是当我收到错误时。

2 个答案:

答案 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
                }
            });