AndroidAnnotations中的NetworkOnMainThreadException

时间:2014-07-02 11:00:43

标签: android android-annotations networkonmainthread

我有一个用@Rest注释的类,我在另一个实例中使用它的方法,用@RestService注释。当我调用Rest客户端类的某些方法时,会出现NetworkOnMainThreadException错误。我认为AndroidAnnotations在这些情况下管理了线程。

3 个答案:

答案 0 :(得分:1)

AndroidAnnotations不会使实现使用后台线程。实际上它不应该,因为不确定调用是否已经在后台线程上,等等。但是你可以轻松地调用带有@Background注释的后台线程。使用它,您可以简单地避免使用AsyncTask样板。

答案 1 :(得分:0)

您正在调用RESTful Web服务,这是一项网络操作。正如Android架构所说,网络操作应该在除UI线程之外的另一个线程上完成。为此,您必须启动另一个线程来执行该操作,但最佳做法是使用AsyncTask

答案 2 :(得分:0)

当应用程序尝试在其主线程上执行网络操作时引发的异常。

仅针对Honeycomb SDK或更高版本的应用程序进行此操作。针对早期SDK版本的应用程序可以在其主要事件循环线程上进行网络连接,但是非常不鼓励这样做。请参阅文档Designing for Responsiveness

为更长时间的操作创建工作线程的最有效方法是使用AsyncTask类。只需扩展AsyncTask并实施doInBackground()方法即可完成工作。要将进度更改发布给用户,可以调用publishProgress(),它将调用onProgressUpdate()回调方法。从您的onProgressUpdate()(在UI线程上运行)的实现,您可以通知用户。例如:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
    // Do the long-running work in here
    protected Long doInBackground(URL... urls) {
        int count = urls.length;
        long totalSize = 0;
        for (int i = 0; i < count; i++) {
            totalSize += Downloader.downloadFile(urls[i]);
            publishProgress((int) ((i / (float) count) * 100));
            // Escape early if cancel() is called
            if (isCancelled()) break;
        }
        return totalSize;
    }

    // This is called each time you call publishProgress()
    protected void onProgressUpdate(Integer... progress) {
        setProgressPercent(progress[0]);
    }

    // This is called when doInBackground() is finished
    protected void onPostExecute(Long result) {
        showNotification("Downloaded " + result + " bytes");
    }
}

要执行此工作线程,只需创建一个实例并调用execute():

new DownloadFilesTask().execute(url1, url2, url3);