10

我是一名长期(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 以像工作者/助手一样获取数据:

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

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 回答
2

常规的内部类持有对外部类对象的引用,因此没有外部类就无法创建其实例。这意味着不能从外部类外部重用内部类。

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

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

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

于 2012-10-27T16:30:28.410 回答