10

私は長い間(8年)C#開発者が小さなAndroid開発に手を出しています。私がJavaを使用するのはこれが初めてであり、内部クラスに関しては考え方を変えるのに少し問題があります。

1つのタイプセーフな場所からサーバー上でさまざまな呼び出しを実行するためにRESTfulAPIをラップするクラスを作成しようとしています。

string jsonResult = APIWrapper.getItems("category 1");

そして、AsyncTaskを使用してバックグラウンドでデータを取得したいと思います。

したがって、1つの方法はこれです-APIWrapperにAsyncTaskを入れます:

class ActivityA extends Activity {

 myButton.setOnClickListener(new OnClickListener() {   
  public void onClick(View v) {

    //get stuff and use the onPostExecute inside the APIWrapper
    new APIWrapper().GetItems("Category A", MyGetItemsCallBack);

  }}); 

 function void MyGetItemsCallBack(String result)
 {
    //render the result in the activity context, in a listview or something
 }

}

とにかく、コールバック/デリゲートのアイデアがJavaで機能するかどうかはわかりません!

もう1つの方法は、アクティビティにAsyncTaskを含め、APIWrapperを作成して、ワーカー/ヘルパーのようにデータを取得することです。

class ActivityA extends Activity {

 myButton.setOnClickListener(new OnClickListener() {   
  public void onClick(View v) {

    //get stuff and use the onProcessComplete inside the APIWrapper
    new GetItems("Category A");

  }}); 

 class GetItems(String theCategory) extends AsyncTask
 {
    doInBackground()
    {
      return new APIWrapper().GetItems(theCategory);
    }

    onPostExecute(String result)
    {
       //render the result in the activity context, in a listview or something
    }

 }


}

誰かが私が正しい選択をするのを手伝ってくれますか?

4

2 に答える 2

2

通常の内部クラスは外部クラスのオブジェクトへの参照を保持するため、そのインスタンスは外部クラスなしでは作成できません。これは、内部クラスを外部クラスの外部から再利用できないことを意味します。

使用している匿名の内部クラスは確実に再利用できません。それらは外部メソッドのコンテキストで作成されます。

ただし、内部クラスを静的として定義することはできます。この場合、コードのどこからでも使用できます。

しかし、あなたの場合、より良い解決策は、解決策として自分で提案したものだと思います。2.個別のクラスを作成するだけで、コード内のどこからでも使用できるようになります。

于 2012-10-27T16:30:28.410 に答える
2

JavaにはC#デリゲートのようなものがないため、最初の提案をそのまま行うことはできません。

標準的な解決策は、コールバックとして渡すことができるインターフェースを宣言することです。

public interface MyCallback {
  void gotItems(String data);
}

その後、あなたは次のようなことをすることができます

class ActivityA extends Activity {
  myButton.setOnClickListener(new OnClickListener() {   
    public void onClick(View v) {
      //get stuff and use the onPostExecute inside the APIWrapper
      new APIWrapper().getItems("Category A", new MyGetItemsCallBack());
  }}); 

  private class MyGetItemsCallBack implements MyCallback {
    public void gotItems(String result) {
      // bla bla bla
    }
  }
}

または、匿名クラスを使用できます。

class ActivityA extends Activity {
  myButton.setOnClickListener(new OnClickListener() {   
    public void onClick(View v) {
      //get stuff and use the onPostExecute inside the APIWrapper
      new APIWrapper().getItems("Category A", new MyCallback() {
        public void gotItems(String result) {
          // bla bla bla
        }
      });
  }}); 

多くの異なる種類のコールバックが必要な場合は、ジェネリックを使用して、多くの小さなインターフェイスを宣言する必要がないようにすることができます。

interface Callback<T> {
  void run(T arg);
}

class ActivityA extends Activity {
  myButton.setOnClickListener(new OnClickListener() {   
    public void onClick(View v) {
      //get stuff and use the onPostExecute inside the APIWrapper
      new APIWrapper().getItems("Category A", new Callback<String>() {
        public void run(String result) {
          // bla bla bla
        }
      });
  }}); 
于 2012-10-27T16:34:47.953 に答える