1

だから私は2つのクラスを持っています。私がやろうとしているのは、MainActivityからMain2 にデータを送信し、 Logcatでログを取得し、MainActivityに制御を戻して他のデータでステップをもう一度繰り返すことです。

しかし、私は予期しない結果を得ています。0,1,2,3,4を取得する代わりに、ランダムなシーケンスを取得します..時には逆の順序で取得します。何故ですか??これはforループの使用によるものですか??

MainActivity.java

public class MainActivity extends Activity {

int REQUEST_CODE = 0;
Intent i;
int k = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    i = new Intent(this, main2.class);
    loop();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        loop();
    }
}

public void loop() {
    for (int j = k; j < 5; j++, k++) {
        i.putExtra("value", j);
        startActivityForResult(i, REQUEST_CODE);
    }
}
}

Main2.java

public class main2 extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Intent intent = getIntent();
    int i = intent.getIntExtra("value", 0);
    Log.d("Value", i + "");
    setResult(RESULT_OK);
    finish();
}  

}

4

3 に答える 3

1

を呼び出すstartActivityForResultとアクティビティが開始され、最終的に開始されるためです。すぐにではなく、開始するまでに数ミリ秒かかる場合があることに注意してください。また、Log.dインスタントでもありません。マルチスレッド プログラミングは、シングルスレッドとは大きく異なります。

于 2013-09-21T12:52:57.560 に答える
0

すべてのアクティビティを同じスレッドから開始しています。loop() メソッドが終了する前に開始されないためです。初めて5つの活動すべてが同時に開始されます。また、開始と終了に同じ時間がかかるという被付与者はいません。したがって、この出力は正常です。

また、別のスレッドで各アクティビティを開始した場合でも、最初に開始されたアクティビティが最初に終了するという被付与者もいません。

これはすべて CPU 処理に依存します。

あなたができることは、ループを取り除くことです。onActivityResult メソッドの最後のアクティビティの応答後にアクティビティを開始するロジックを実行します。

例:

public void loop() {
    j = k;
    i.putExtra("value", j);
    startActivityForResult(i, REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (resultCode == RESULT_OK)
    {
        j++;
        if (j<5)
        {
            i.putExtra("value", j);
            startActivityForResult(i, REQUEST_CODE);
        }
        else
        {
            k++;
            loop();
        }
    }
}

私はわかりません。しかし、これはまさにあなたが望むものだと思います。これにはもう少し時間がかかるかもしれません。

于 2013-09-21T13:25:04.007 に答える
0

startActivityForResultの使用は、特定のニーズのためのものです。たとえば、MainActivityは、この値を取得するためにMain2でのみ使用可能な値をフェッチする必要があります。使い方の例として、アクティビティAはメールを書く画面で、連絡先を入力する欄があります。アクティビティ B は、連絡先のリストのみを表示します。

この場合、基本的に次のことを行います。

  1. アクティビティ A: startActivityForResult(, ) を呼び出します。
  2. アクティビティ B: 連絡先のリストを表示し、ユーザーのクリックを待ちます。連絡先の onClick で、基本的に連絡先の電子メールを取得します。ユーザーの電子メールを使用して、新しいインテントを入力し、setResult(RESULT_OK, IntentData); を呼び出します。
  3. onActivityResult() で、結果 == RESULT_OK の呼び出しと要求コード == X を期待するコードを配置します...それが来ると、onActivityResult メソッドで指定されたインテントからパラメーターを読み取り、電子メールで送信され、前のステップの意図で渡したすべてのパラメーター。

以上です!幸運を!

于 2013-09-21T13:26:30.783 に答える