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

我很长一段时间(8年)C#开发人员在一个小小的Android开发中涉猎。 这是我第一次使用Java,并且在内部类中转移我的思维方式有点麻烦。

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

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

我不确定callback/委托的想法在Java中工作!

另一种方法是在Activity中创buildAsyncTask,并创buildAPIWrapper来获取像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 } } } 

任何人都可以帮助我做出正确的select吗?

Solutions Collecting From Web of "我如何重用Java / Android中的内部类?"

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

标准的解决scheme是声明一个可以作为callback传递的接口:

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

如果您需要多种不同的callback,您可以使用generics来避免声明许多小接口:

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

普通的内部类持有对外部类对象的引用,所以它的实例不能在没有外部类的情况下创build。 这意味着内部类不能从外部类重新使用。

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

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

但是你的情况我认为更好的解决scheme就是你自己提出的一个解决scheme2.只需创build单独的类,这样你就可以在代码中的任何地方使用它。