7

そのため、スレッドを処理するために、Android アプリのいたるところにアクティビティとインテントを渡しています (コードがスパゲッティのようになり始めているため、これにはより良いパラダイムがあると確信しています。通常、私は正しいことをしていない)。

とにかく、私はこのようなことをしようとしています:

public class SomeCoolActivity extends Activity {
    private class DoSomeTaskThatInvolvesEitherTheNetworkOrASleepStatementWithoutScrewingUpTheUiThread extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            // Do something useful on a non-UI thread...
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // Now that's done, I need to progress to the next activity. If I do that here,
            // I will get errors. So instead, I will call a method on my parent activity class:
            loadNextActivity(NextActivity.class);
        }
    }

    protected void loadNextActivity(Class<Activity> activityToLoad) {
        startActivity(new Intent(this, activityToLoad));
    }
}

しかし、これは機能しません。エラーがあることがわかります。

NextActivity.class

アクティビティではありません。はい、明らかにまったく同じクラスではありませんが、Activity から派生したクラス (NextActivity を含む) を渡すことができると期待されますが、そうでないクラスは渡せません (loadNextActivity を定義すると、実際には正常に動作します)。なので

protected void loadNextActivity(Class<?> activityToLoad)

しかし、それは理想的とは言えません。なぜなら、私が望むもの、おそらくアクティビティではない何かを渡すことができるからです...これはJavaであり、Rubyではありません)。それに、たった一学期しか合格できないとしたら……一体何の得があるんだ?

では、どうすればこれを機能させることができますか?

4

3 に答える 3

5

次のようなワイルドカードを記述できます。

protected void loadNextActivity(Class<? extends Activity> activityToLoad)

を使用するのは良い習慣ではありませんClass<?>。クラストークンの正確なタイプはわかりません。うーん、ワイルドカードを使用して、上で書いたようにメソッドのグローバルな動作を定義してみてください。

ちなみに、Manifest.xmlファイルに追加する各アクティビティは、次のようにしてください。

<activity android:name=".com.bla.bla.YourOtherActivity" />
于 2012-11-29T18:07:33.597 に答える
0

あなたのコードのコメントは、「ここでそれを行うと、エラーが発生します。」. どのようなエラーが発生していますか? getIntent() の引数として無効なコンテキストがあったのですか? それとも startActivity() が有効ではありませんでしたか? 考えられる理由は、アクティビティ自体ではなく、内部クラスから onPostExecute() が呼び出されていることです。

これを試して:

  onPostExecute(Void result) {
    Intent intent = new Intent(SomeCoolActivity.this, NextActivity.class);
    startActivity(intent);
  }
于 2012-11-29T18:37:37.820 に答える
0

余談ですが、アクティビティを渡したり、変数に保存したりしたくありません。これを行うと、ビュー階層全体がリークし、RAM が非常に速く使い果たされます。

于 2012-11-29T18:44:48.320 に答える