0

私のアプリでは、asynctask でインターネットから天気情報を取得しますが、サーバーが少し遅れる場合があり、リクエスト間で 10 秒待機して最大 10 個のリクエストを作成したいと考えています (以前のリクエストが失敗した場合)。しかし、asynctask を 10 秒間待機させると (モデリングがサーバーに応答しない)、メイン スレッド (ユーザー インターフェイス) は、asynctask がジョブを終了するまでフリーズします (10 ラウンドの要求を行います)。

これは、asynctaskを作成して実行するコードです

WeatherGetter wg = new WeatherGetter();
    wg.execute(url);
    try {
        weather = wg.get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }

そして、これは私がそれを待つ場所です

if (cod != 200) {
            synchronized (WeatherGetter.this) {
                try {
                    WeatherGetter.this.wait(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
4

1 に答える 1

2

この方法を試してください

スレッドを待たないでください

このように code!=200 の場合、同じ関数を再帰的に呼び出します

private void loadWhetherData(final int count) {

        new AsyncTask<Void, Void, Void>() {

            @Override
            protected Void doInBackground(Void... params) {
                WeatherGetter wg = new WeatherGetter();
                wg.execute(url);
                try {
                    weather = wg.get();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
                if (cod != 200 && count<10) {
                    loadWhetherData(++count);
                }
                return null;
            }
        }.execute();

    }

電話

このメソッドは、成功しないまで 10 回呼び出します

loadWhetherData(1);
于 2013-09-13T07:00:09.623 に答える