で注釈が付けられたクラスがあり@Rest
、 で注釈が付けられた this のインスタンスを持つ別のクラスでそのメソッドを使用します@RestService
。Rest クライアント クラスのメソッドを呼び出すと、NetworkOnMainThreadException
エラーが表示されます。これらのケースでは、AndroidAnnotations がスレッド化を管理していると思いました。
3 に答える
AndroidAnnotations は、バックグラウンド スレッドを使用する実装を作成しません。呼び出しが既にバックグラウンド スレッドにあるかどうかなどは不明であるため、実際にはそうする必要はありません。ただし、@Background
アノテーションを使用してバックグラウンド スレッドへの呼び出しを簡単に配置できます。AsyncTask
それを使用すると、ボイラープレートを簡単に回避できます。
ネットワーク操作である RESTful Web サービスを呼び出しています。Android アーキテクチャが言うように、ネットワーク操作は UI スレッドとは別のスレッドで行う必要があります。このためには、その操作を行うために別のスレッドを開始する必要がありますが、ベスト プラクティスはAsyncTaskを使用することです。
アプリケーションがメイン スレッドでネットワーク操作を実行しようとしたときにスローされる例外。
これは、Honeycom SDK 以降を対象とするアプリケーションに対してのみスローされます。以前のバージョンの SDK を対象とするアプリケーションは、メイン イベント ループ スレッドでネットワークを実行できますが、推奨されません。ドキュメントレスポンシブの設計 を参照してください。
より長い操作のためにワーカー スレッドを作成する最も効果的な方法は、AsyncTaskクラスを使用することです。メソッドを拡張AsyncTask
して実装するだけで、作業を実行できます。doInBackground()
進行状況の変更をユーザーに通知するには、コールバック メソッドpublishProgress()
を呼び出す を呼び出します。onProgressUpdate()
(UI スレッドで実行される)の実装からonProgressUpdate()
、ユーザーに通知できます。例えば:
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);