httpリクエストの進行中にProgressBarをスピンさせます。

それはすべて、私が突然アンドロイドのために何かをしたかったという事実から始まりました。 そして、これらはすべて、javaが私の母国語ではないという事実にもかかわらずです。

アプリケーションを作成する過程で、いくつかの困難に直面しました。その解決策を教えてください。 私と同じように、初心者にとっても役立つと思います。指導者からのアドバイスやより美しい例に感謝します。

しかし、例のパフォーマンスの主な確認は、アプリケーションが機能していることです。 確認できます。



私が遭遇したいくつかの問題は次のとおりです。



とりあえず最初の問題を考えてみましょう。

UIはサーバーからの応答を待っていますが、勝つ方法は?



サーバーとの対話がこのアプリケーションの鍵です。 アプリケーションがサーバーに要求を送信するとき、応答を待つ必要があります。 この待機中に、ユーザーインターフェイスが停止し、プログラムがクラッシュしたようです。 回答が1秒以内に受信されても​​問題ありませんが、実際には、サーバーからの応答を待機するのに約10秒かかることがあります。 アプリケーションがハングしないことをユーザーに通知するには、ProgressBarを表示する必要があります。 AJAXのように、私は糸車に落ち着きました。 これは次のようなものです。





おおよその仕組みを説明します。 私はいくつかのクラスHttpClientを持っています。サーバーとのやり取りを担当します。 ProgressBarを開始および停止します。 このクラスは非同期に動作します。 つまり、アプリケーションは、起動することで動作するまで待機せず、動作を継続できます。 これは、次の構成によって実現されます。

//   public class HttpClient extends AsyncTask<Void, Integer, Long>{ ... //   public ProgressDialog dialog; //    Context ctx; ... //  ProgressBar     protected void onPreExecute() { dialog = new ProgressDialog(ctx); dialog.setMessage("..."); dialog.setIndeterminate(true); dialog.setCancelable(true); dialog.show(); } //   , SendHttpPost() -    protected Long doInBackground(Void... params) { try { response = SendHttpPost(); } catch (Exception e) { e.printStackTrace(); response = null; } return null; } //      ,  ProgressBar protected void onPostExecute(Long unused) { dialog.dismiss(); ... //     ,    //     : ((Runnable)ctx).run(); .... super.onPostExecute(unused); } .... }
      
      







HttpClientを呼び出す親クラスは次のようになります。

 public class SearchableActivity extends ListActivity implements Runnable { private HttpClient req; ... //   ,       private void showResults(String query) { ... req = new HttpClient(); req.execute((Void)null); } //     HttpClient,        -    public void run() { ... //   req    ,    Activity ... } }
      
      







Runnableの道を進んだという事実は、私にとって非常に議論の余地があるように思えますが、その時点では他に考えはありませんでした。



しかし、私はこの記事で非同期に写真をダウンロードして表示することを学びました: habrahabr.ru/blogs/android/78747 失礼しました



All Articles