web-dev-qa-db-ja.com

Android

同僚、私はそのような質問をします:1.私の最初のクラスでは、

public class parseYouTubeAndYahoo extends AsyncTask<String, Void, List<VideoDataDescription>>

インターネットからのデータを解析する。しかし、私はこのクラスのexecute()メソッドを別のクラスから呼び出す必要があります。そのようなコードを修正しようとしている間:

new MainActivity.parseYouTubeAndYahoo().execute("someURL"); 

私はEclipseから次のエラーメッセージを受け取ります

MainActivityタイプの囲みインスタンスにアクセスできません。 MainActivityタイプの囲みインスタンスで割り当てを修飾する必要があります(例:x.new A() xはMainActivityのインスタンス)。

本当にこの問題は私にとって霧に包まれています。では、このメソッドを別のクラスから呼び出す方法は?

23
Eugene Shmorgun

ここでの実際のエラーに関して、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ネストされたクラスのインスタンスを取得するための適切な構文です。

54
LuxuryMode

あなたのparseYouTubeAndYahooクラスはクラスMainActivityの内部クラスだと思いますが、Javaではnew MainActivity().new parseYouTubeAndYahoo()によって内部クラスのオブジェクトをインスタンス化する必要があるので、このようなメソッドを呼び出しますnew MainActivity().new parseYouTubeAndYahoo().execute("someURL");

また、MainActivityActivityクラスを拡張するので、MainActivityクラス内でこのメソッドを呼び出すだけでthis.new parseYouTubeAndYahoo().execute("someURL");になると思います。

3
Huang

AsuncTaskを別のクラスとして別のファイルに配置する方が簡単です。

しかし、本当に内部クラスが必要な場合は、静的であるか、最初に親クラスへの参照を取得する必要があります。これは次のように実行できます。

mainActivityのonCreateで:

static MainActivity activityInstance = getContext();

MainActivityの新しいメソッド:

public static MainActivity getActivityInstance(){
  return activityInstance;
}

次に、別のアクティビティでインスタンスを取得し、そのパブリックメソッドにアクセスできます

MainActivity instanceOfMainActivity = MainActivity.getInstance();

その後

新しいinstanceOfMainActivity.parseYouTubeAndYahoo()。execute( "someURL");

3
Lumis

アクティビティのコンテキストを他のクラスに参照して使用します。

そのように:public oneofconstructer(Context ctx、.....)

1
Tugrul