6

メイン アクティビティからサブアクティビティを呼び出しています。このサブアクティビティは、ユーザーからいくつかの数値を取得し (これを達成するために編集テキスト コントロールを使用しています)、それらを別のクラスの静的変数に保存して終了します。メインアクティビティにサブアクティビティを待機させたいのですが、両方が同時に実行されています。そのように sth を実行しても役に立ちません:

     Thread t = new Thread(new Runnable(){
     public void run(){
     Log.v("==================", "run "+new Date());
     startActivityForResult(new Intent(ctx,myCustomSubactivity.class),1);  
     } });
     Log.v("==================", "calling run "+new Date());
     t.start();      
     try {
        t.join();
    } catch (InterruptedException e) {Log.v("==================", "can't join");}
    Log.v("==================", "back from activity "+new Date());

メインアクティビティを強制的に待機させる方法を知っていますか? Thread.wait() メソッドは Android ではサポートされていません (プログラムがエラーをスローします)。

4

5 に答える 5

7

私は何かが欠けているかもしれませんが、メカニズムを使用しないのはなぜstartActivityForResultですかonActivityResult? 結果が得られた意図から、サブアクティビティから結果を得ることができます。
編集:ところで、私が理解している限り、コードObject.wait()から実行Activityすると、UI トレッドを保持するとApplication not respondingエラーが発生する可能性があります。

于 2010-05-21T08:50:20.597 に答える
3

Notepad exampleを確認してください。まさにこの状況をカバーしています。他の人が言ったように、Android のやり方では、最初のアクティビティで 2 番目のアクティビティ (サブアクティビティではありません!) を開始し、応答を非同期にリッスンします (一時停止または待機せず、参加する必要はありません)。

于 2010-05-21T17:44:13.400 に答える
3

私はニコライに同意します。これは間違いなくこれを行うアンドロイドの方法です。

サブ アクティビティでstartActivityForResultを使用してサブアクティビティを開始し、setResultを使用して、データ バンドルに必要なすべての数値を含む結果コードとインテントを追加します。

最初のアクティビティで onActivityResultを上書きし、インテントから数値を取得します。

静的変数を使用すると、最初は簡単に見えますが、非常に安全ではなく、うまくいかない場合もあります。プログラムがバックグラウンドに送信された場合、アクティビティは保存されますが、電話のメモリが不足している場合、システムはプログラムを閉じ、ユーザーが再開した後、すべてがユーザーが終了した瞬間のように見えますが、静的変数は再作成されますそれらの初期値。

Androidアクティビティのライフサイクルの仕組みに慣れるようにしてください。このアプローチを使用すると、使用メモリが少なくなり、ユーザー エクスペリエンスが大幅に向上します。

于 2010-05-21T09:11:01.247 に答える
2

まあ...次のようにすることができます(ところで、簡単な方法はありません):

シングルトン クラスを用意します。これを Monitor と呼びましょう。

public class Singleton
{
   private Singleton() { }
   private static Singleton instance = new Singleton();

   public static Singleton getInstance() {
      return instance;
   }
}

public class ParentActivity extends Activity
{
    private void startAndWait()
    {
        Intent i = new Intent();
        // initialize i
        startActivityForResult(i);
        Singleton si = Singleton.getInstance();
        synchronized(si)
        {
             si.wait();
        }
        //do remaining work
    }
}

public class ChildActivity extends Activity
{
       protected void onCreate(Bundle savedInstance)
       {
           //do all the work
           Singleton si = Singleton.getInstance();
           synchronized(si)
           {
             si.notify();
           }
       }
}
于 2010-05-21T06:22:28.060 に答える