同僚、私はそのような質問をします:1.私の最初のクラスでは、
public class parseYouTubeAndYahoo extends AsyncTask<String, Void, List<VideoDataDescription>>
インターネットからのデータを解析する。しかし、私はこのクラスのexecute()メソッドを別のクラスから呼び出す必要があります。そのようなコードを修正しようとしている間:
new MainActivity.parseYouTubeAndYahoo().execute("someURL");
私はEclipseから次のエラーメッセージを受け取ります
MainActivityタイプの囲みインスタンスにアクセスできません。 MainActivityタイプの囲みインスタンスで割り当てを修飾する必要があります(例:x.new A() xはMainActivityのインスタンス)。
本当にこの問題は私にとって霧に包まれています。では、このメソッドを別のクラスから呼び出す方法は?
ここでの実際のエラーに関して、parseYouTubeAndYahoo
クラスがアクティビティ内の静的でない内部クラスである場合、内部クラスをインスタンス化するには、囲んでいるクラスのインスタンスが必要です。したがって、次のものが必要です。
MainActivity myActivity = new MainActivity();
MainActivity.parseYouTubeAndYahoo asyncTask = myActivity.new parseYouTubeAndYahoo();
しかしながら....
Activity
の外部からアクティビティの非静的内部クラスをインスタンス化するべきではありません。非静的内部クラスをインスタンス化するためには、これを囲むクラスを実際にインスタンス化する必要があるためです。ケースはアクティビティです。アクティビティはnew
を介してインスタンス化されるのではなく、開始されることを意図しています。別の場所で使用したいAsyncTask
がある場合は、AsyncTask
から拡張する新しい最上位クラスを作成します。
(再利用可能なAsyncTasks
の作成例については、次を参照してください: https://github.com/levinotik/ReusableAsyncTask )
staticネストされたクラスを取得する必要がある場合は、WOULDを使用しようとした構文が機能することに注意してください。これは、そのような場合、外部クラスは実際には名前空間として機能するだけですが、ネストされたクラスは静的であるため、実際には外部クラスのインスタンスへの参照を必要としないためです。したがって:
OuterClass.StaticNestedClass nestedObject =
new OuterClass.StaticNestedClass();
staticネストされたクラスのインスタンスを取得するための適切な構文です。
あなたのparseYouTubeAndYahoo
クラスはクラスMainActivity
の内部クラスだと思いますが、Javaではnew MainActivity().new parseYouTubeAndYahoo()
によって内部クラスのオブジェクトをインスタンス化する必要があるので、このようなメソッドを呼び出しますnew MainActivity().new parseYouTubeAndYahoo().execute("someURL");
また、MainActivity
はActivity
クラスを拡張するので、MainActivity
クラス内でこのメソッドを呼び出すだけでthis.new parseYouTubeAndYahoo().execute("someURL");
になると思います。
AsuncTaskを別のクラスとして別のファイルに配置する方が簡単です。
しかし、本当に内部クラスが必要な場合は、静的であるか、最初に親クラスへの参照を取得する必要があります。これは次のように実行できます。
mainActivityのonCreateで:
static MainActivity activityInstance = getContext();
MainActivityの新しいメソッド:
public static MainActivity getActivityInstance(){
return activityInstance;
}
次に、別のアクティビティでインスタンスを取得し、そのパブリックメソッドにアクセスできます
MainActivity instanceOfMainActivity = MainActivity.getInstance();
その後
新しいinstanceOfMainActivity.parseYouTubeAndYahoo()。execute( "someURL");
アクティビティのコンテキストを他のクラスに参照して使用します。
そのように:public oneofconstructer(Context ctx、.....)