我很长一段时间(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
}
}
}
任何人都可以帮我做出正确的选择吗?
答案 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
}
});
}});