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

アプリケーションがメイン スレッドでネットワーク操作を実行しようとしたときにスローされる例外。

これは、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);
于 2014-07-02T11:08:16.723 に答える