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

标签 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
 }

}

无论如何,我不确定回调/委托(delegate)的想法在 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
    }

 }


}

谁能帮我做出正确的选择?

最佳答案

Java 没有像 C# 委托(delegate)这样的东西,所以你的第一个提议是不可能的。

标准的解决方案是声明一个可以作为回调传递的接口(interface):

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):

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
        }
      });
  }}); 

关于java - 如何在 Java/Android 中重用内部类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13101928/

相关文章:

java - 为什么使用增强的 for 循环来实现冒泡排序会给我 ArrayIndexOutOfBoundsException?

java - Android Volley 从 onResponse 问题中获取响应

java - android 5.0.1 sdk 包适用于 android 5.0.4 吗?

Android Fused LocationSettingsRequest 从 startResolutionForResult 中删除 "never"选项

android - AsyncTask 中的 ProgressDialog 抛出 NullPointerException?

Android:微调器显示来自网络服务的内容

java - 在 servlet 中获取原始 HTML 以生成 PDF 文件

java - count[name.charAt(i)]++ 和 count[str1.charAt(i) - 'a' ]++ 之间的确切区别是什么?

Android向小部件添加标题

android - 按后退按钮取消异步任务下载