1

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

4

3 回答 3

1

AndroidAnnotations 不会使实现使用后台线程。实际上它不应该这样做,因为不确定调用是否已经在后台线程上等等。但是你可以很容易地使用@Background注释将调用放到后台线程上。使用它,您可以简单地避免AsyncTask样板。

于 2014-07-02T11:18:00.460 回答
0

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

于 2014-07-02T11:05:04.143 回答
0

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

这仅针对面向 Honeycomb SDK 或更高版本的应用程序抛出。允许以早期 SDK 版本为目标的应用程序在其主事件循环线程上进行网络连接,但非常不鼓励这样做。请参阅文档设计响应性

为更长的操作创建工作线程的最有效方法是使用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);
于 2014-07-02T11:08:16.723 回答