2

たとえば、私たちは SomeActivity にいて、アクティビティには、あるディレクトリから別のディレクトリへのファイルの移動を呼び出すボタンがあります (ジョブと呼びましょう)。

BlackBerry では、次のことを行います。

  1. 「お待ちください...」というキャンセル不可のポップアップ(ダイアログ画面)をプッシュします。
  2. 仕事を遂行するスレッドを開始する
  3. スレッドの完了時にポップアップを閉じる

このアプローチにより、タスクが終了した後も同じ画面にとどまることが 99.99% 保証されます。ユーザーはポップアップを見て、ジョブの完了を待つだけです。デバイスの回転など、目的のワークフローを壊さないもの。

Android では状況が変わります。私のケースを解決するためにおそらく提供されている AsyncTask があることは知っています。それがどのように使用されるべきかの良い例さえあります。ただし、Activity インスタンスが存続する期間は保証されていないため、AsyncTask は onSaveInstanceState でキャンセルする必要があります (onRestoreInstanceState で再開します)。これは、AsyncTask を使用すると、開始したジョブを完全に実行できるという保証がないことを意味します。場合によっては、ユーザーを作成するための http 投稿要求を送信するときに、AsyncTask の再実行時に「このログインにユーザーが既に存在する」という問題に遭遇したくない場合があります。これが可能なのは、リクエストが送信されている間に AsyncTask が中断される可能性があるためです (そして、サーバーは実際に新しいユーザーを作成している間)、応答を受け取る前に AsyncTask がキャンセルされます。

上記の BB のような動作を取得するための Android 上の解決策はありますか?

4

3 に答える 3

2

ただし、Activity インスタンスが存続する期間は保証されていないため、AsyncTask は onSaveInstanceState でキャンセルする必要があります (onRestoreInstanceState で再開します)。

または、 によって管理されますService

于 2010-02-11T00:58:59.850 に答える
1

アクティビティが画面に留まりたい場合は、次のようにスレッドを開始するだけです。

final File fromFile = ...;
final File toFile = ...;

new Thread() {
    @Override
    public void run() {
      // do something with fromFile, toFile
    }
}.start();

そうすれば、GUI スレッドは、

  android.app.ProgressDialog

また、ダイアログをキャンセルできないようにすることを検討してください

  ProgressDialog.setCancelable(false);

そうすれば、ユーザーはHOMEキーを介してのみ離れることができ、いつ通知されるかが通知されます

  Activity.onPause()

と呼ばれます。さらに、Wakelocks を調べて、画面が黒くなり、アプリケーションが強制終了される可能性のあるバックグラウンドでプッシュされるのを防ぐことができます。スレッドでこれを行います:

  PowerManager pm = (PowerManager) ivContext.getSystemService(Context.POWER_SERVICE);
  Wakelock wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "MyApp");
  wakeLock.acquire();

  // ... copy stuff ...

  wakeLock.release();

もちろん、ユーザーが HOME-Key を介して離れるときも、wakeLock を解放する必要があります。

最後に、バックグラウンド スレッドから GUI 要素を呼び出したい場合、これはスレッドが GUI イベント ループの一部である場合にのみ機能します。これは、実行中の通常のスレッドのように、on で呼び出されたときに... -方法。これを実現するには、バックグラウンド スレッドがハンドラーを介して GUI スレッドにコールバックする必要があります。このような:

  private Handler mHandler = new Handler() { 
      @Override
      public void handleMessage(Message msg) {
          Log.v(TAG, "Got Message "+msg.what); // prints: Got Message 77
      // ... do GUI actions ...
      }    
  };

  // ... in Thread ...

  int lvInfo = 77;
  mHandler.sendEmptyMessage(lvInfo);

次のように、オブジェクトをメッセージに入れることもできます。

  Message txtMsg = Message.obtain();
  textMsg.obj = "Hello World";
  mHandler.sendMessage(lvTextMsg);
于 2010-02-11T04:42:19.253 に答える
0

2010 年 5 月、Google はAndroid REST クライアント アプリケーションの開発と呼ばれる新しい IO セッションを発行しました。

問題はかなり複雑であることが判明したため、簡単で迅速な解決策はありません。このソリューションには、Android プラットフォーム/API に関する深い知識が必要です。これは、アプリ プロセス/アクティビティ ライフサイクルの柔軟性に起因する価格です。

この情報が Android の最初のバージョンから表示されなかった理由については、奇妙な点を感じます。Google は 100% バグのないアプリを作成する方法を知っていたようですが、何らかのマーケティング上の理由でそのアプローチを共有していませんでした。2010 年 5 月までに作成されたバグのあるアプリの数を想像してみてください。

とにかく、ベスト プラクティス アプローチと呼ばれる方法が得られたことをうれしく思います。

于 2011-04-14T20:13:07.427 に答える