我有一个带有注释的类@Rest
,我在另一个带有 this 的实例中使用它的方法,注释为@RestService
. 当我调用 Rest 客户端类的某些方法时,会NetworkOnMainThreadException
出现错误。我认为 AndroidAnnotations 在这些情况下管理线程。
问问题
577 次
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 回答