有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我是一名长期(8年)从事安卓系统开发的C#开发者。这是我第一次使用Java,当涉及到内部类时,我很难改变我的思维方式

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

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

我想使用一个异步任务来获取后台的内容

因此,一种方法是将AsyncTask放在APIWrapper中:

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中是否有效

另一种方法是在活动中使用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
    }

 }


}

有人能帮我做出正确的选择吗


共 (2) 个答案

  1. # 1 楼答案

    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
            }
          });
      }}); 
    
  2. # 2 楼答案

    常规内部类持有对外部类的对象的引用,所以在没有外部类的情况下无法创建其实例。这意味着内部类不能从外部类重用

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

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

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