3

こんにちは、これは非常に単純な質問ですが、複雑な答えだと思います。

それは「廃坑シナリオ」と呼ばれる

説明させてください:信号のない坑道でも Web ページに httppost できるアプリを作成しなければならない単純なシナリオを想像してみてください。

つまり、接続がない場合に送信イベント (HTTPPOST) を試行/キューに入れ、イベントが発生するまで定期的にキューをポーリング (接続の存在をテスト) する方法を教えてください。

PS: 注意してください: これは「方法」に関するものであり、これの「誤り」についての対話ではありません。re: 同期性または重複レコードまたは 2 人のユーザーからのデータの上書きなど。

疑似コード:

try{
   MyHttpFileUploader myupload = new MyHttpFileUploader();
   myupload.Start();
}
catch (InternetDownException ex){ //<-- how do I "throw" this in the start method gracefully?
   GlobalQueue.Add(myupload); //<-- how do i set a timer properly that can action this queue (.Start() method) and post messages "when complete" to toast on the main ui thread but otherwise not block the ui whatsoever
}
4

2 に答える 2

2

これは大まかなものです(私は現在主にc#でコーディングしており、質問には関係がないため)semi psuedo-主要なポイント(スレッド)にsunドキュメントスニペットを含むコード

Threadを拡張する非同期POSTメソッドで必要な変数にアクセスできるクラスを作成します。

 class WorkerThread extends Thread {
     int someDataYouNeed;
     MyHttpFileUploader maybeAClassYouNeedToCommunicateWithAtEnd;
     boolean hasNotFinishedTask = true;
     WorkerThread(int someDataYouNeed, MyHttpFileUploader callBackClass) {
         this.someDataYouNeed = someDataYouNeed;
         this.maybeAClassYouNeedToCommunicateWithAtEnd = callBackClass;
     }

     public void run() {

         while(hasNotFinishedTask){
         //do your work in here 
         //Try contact network endpoint
         try{
             //do a network call and if it doesnt except
             hasNotFinishedWork = false
             //now callback to the class firing a method maybe (I just made one up)
             maybeAClassYouNeedToCommunicateWithAtEnd.Close();
         }catch(TheException ex){ //do nothing or log }
         if(hasNotFinishedTask){
              Thread.Sleep(60000);//retry every minute
            }
         }
     }
 }

//非同期タスクが失敗したときにスレッドをインスタンス化します...。

 WorkerThread worker = new WorkerThread(42, this);
 worker.start();

さて、私が言ったように、アプリケーションはスマートフォンで実行されており、シャットダウンできると思います...その場合、OSで許可されている限り、(WorkerThreadを作成するときに)状態を次のように保存できます。ファイルシステムとWorkerThreadインスタンス化のxmlは、ファイルが存在するかどうかを確認し、ファイルがシャットダウンされたときに残っていた場所から開始します。

ポイントa)私の例はメールサーバーでしたが、どちらもネットワークエンドポイントであり、利用できない可能性があります

アップデート:

今、私はそれがストレートJavaであると仮定しました(そして私はc#なので、プラットフォーム上ではそれほど頻繁ではないことを覚えておいてください)が、新しいバージョンのjavaまたはandroidでこのようなものの非同期ジェネリック型の簡単な例があるように見えます。 。

Android固有のマルチスレッディングについてはこのブログ投稿を参照してください。プラットフォーム固有の例についてはAndroidマルチスレッディングをGoogleで検索してください。

于 2012-12-05T21:27:15.540 に答える
0

1 つの方法は、 IntentServiceAlarmManagerを使用して、データの送信を試みることです。

ここでインテントの使用に関する詳細情報があり、インテントは AlarmManager によってトリガーされる可能性があります

このスレッドにはいくつかのコード サンプルがありますAlarmManager not working

于 2012-12-19T11:10:47.973 に答える