1

バックグラウンドでネットワーク機能 (ファイルのダウンロード/アップロード、http 要求) を実行するアプリケーションに asynctasks がいくつかあります。これらのアクションProgressDialogの進行中に、タスクの進行状況に関するメッセージを表示するために使用します。ただし、一部のタスクは完了までに時間がかかる場合があり (低速ネットワークでファイルをダウンロードするなど)、これはアプリケーションにとって望ましくないことです。

各 asynctask の期間を制御するパラメーターを設定するにはどうすればよいですか? タスク内のジョブの完了に関係なく、ある時点で asynctask を完了させたいです。asynctask で onPostExecute メソッドを呼び出さなければなりません。

私はこれについて読みましたhttp://developer.android.com/reference/android/os/AsyncTask.html#get%28long,%20java.util.concurrent.TimeUnit%29

UI がフリーズし、asynctask の期間を実際に制御できなかったため、これはあまり役に立ちませんでした。

これは私のコードの一部です

public void downloadFiles(String address) {
        String mainUrl =address;

        //// I overrride the onPostExecute to get
        /// results and call another asynctask
        new Downloader(this){ //<--asynctask
            @Override
            protected void onPostExecute(String result){
                super.onPostExecute(result);
                TestResults=result;

            //another method called that creates another asynctask
             uploadFiles(mainUrl);

            }
        }.execute(mainUrl);


    }

このような Handler も使用しようとしましたが、 どちらも機能しませんでした。

一定期間後に asynctask が結果を返すようにする方法はありますか (つまり、asynctask が onPostExecute メソッドを呼び出すことを意味します)。

asnctask の doInBackground メソッドで while ループを使用することは解決策ではありません。asynctask が結果を返すようにするには、mainUI からのタイマーが必要だと思います。

PS私はフラグメントを使用してアプリケーションを持っていますnew Downloader(this)。そのため、フラグメントからGUIを渡すために呼び出します。

これを試してみました:

public void downloadFiles(String address) {
        String mainUrl =address;


        final Downloader tempObject =new Downloader(this){
            @Override
            protected void onPostExecute(String result){
                super.onPostExecute(result);
                downloadResults=result;
                }
        };
        try {
            tempObject.execute(mainUrl).get(3000L, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TimeoutException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

これにより、UI が 3 秒間フリーズし、タスクが呼び出されます....これは私が望んでいるものではありません。

これも試しました:

Handler handler = new Handler();
        handler.postDelayed(new Runnable()
        {
          @Override
          public void run() {
              if ( tempObject.getStatus() == Downloader.Status.RUNNING )
                  tempObject.cancel(true);
          }
        }, 5000 );

これにより、asynctask の onProgressUpdate のメッセージが停止しますが、asynctask は実行を続けます....

何か案は ?

4

1 に答える 1

0

Handler 関数の方法論を機能させるには、何か追加が必要です。問題の解決策はここにあります

AsyncTaskキャンセルされる可能性がありますが、doInbackgroundメソッドはまだ実行中です。実際には、タスクの値は「キャンセル」に設定されていますが、タスクがdoInbackgroung終了するまで実行されます。これを解決するには、ループ内で定期的にチェックしてdoInbackground、タスクがキャンセルするように設定されているかどうかを確認する必要があります。これはまさに私がやりたかったことではありませんが、これが唯一の解決策のようです。

ではdoInBackground、タスクのステータスをチェックして、キャンセルされたかどうかを確認する必要があります。したがって、実際には、誰かが doInbackground 内にタイマーを持っているだけで、ハンドラー クラスを使用せずに生活を楽にすることができます。

synctask の実行を自由に終了できないのは残念です..... 誰かもっと良いアイデアがあれば教えてください。

于 2013-07-05T00:03:39.610 に答える