如何在Java / Android中重用内部类?

时间:2012-10-27 16:22:34

标签: java android android-asynctask

我很长一段时间(8年)C#开发人员涉足一些Android开发。这是我第一次使用Java,而且在内部课程方面我的思维方式有些麻烦。

我正在尝试编写一个类来包装RESTful API,以便从一个类型安全的地方执行服务器上的各种调用,例如:

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

我想使用AsyncTask在后台获取内容。

所以有一种方法 - 在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!

另一种方法是在Activity中使用AsyncTask并创建APIWrapper以获取像worker / helper这样的数据:

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
    }

 }


}

任何人都可以帮我做出正确的选择吗?

2 个答案:

答案 0 :(得分:2)

Regular内部类保存对外部类对象的引用,因此如果没有外部类,则无法创建其实例。这意味着内部类不能从外部类外部重用。

您正在使用的匿名内部类无法重用:它们是在外部方法的上下文中创建的。

但是,您可以将内部类定义为静态。在这种情况下,您可以在代码中的任何位置使用它。

但是你的情况我认为更好的解决方案是你自己建议的解决方案2.只需创建单独的类,这样你就可以在代码中的任何地方使用它。

答案 1 :(得分: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
        }
      });
  }});