gpt4 book ai didi

java - 来自 AsyncTask 类的回调

转载 作者:行者123 更新时间:2023-11-30 09:05:49 25 4
gpt4 key购买 nike

我有一个APIHelper类,它的静态方法异步向服务器发出请求,接收json字符串,解析并返回对象或ArrayList:

    ...
public static ArrayList<Item> getItemsInCategory(int id_category) throws ExecutionException, InterruptedException, JSONException {
DoRequest doRequest = new DoRequest();
String jsonString = doRequest.execute(API_PATH + PRODUCT_SEARCH + CATEGORY_ID + id_category).get();
JSONObject jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray("products");
return Item.fromJson(jsonArray);
}
public static Item getItem(int id_item) throws ExecutionException, InterruptedException, JSONException {
DoRequest doRequest = new DoRequest();
String jsonString = doRequest.execute(API_PATH + PRODUCT_GET_INFO + id_item).get();
JSONObject jsonObject = new JSONObject(jsonString);
return Item.fromJson(jsonObject);
}
...

现在我想在不从 AsyncTask 类 DoRequest 调用 get() 方法的情况下创建方法。

我的DoRequest类:

public class DoRequest extends AsyncTask<String, Void, String> {
ResultListener mResultListener;

public abstract interface ResultListener{
Object onResultAvailable(String result) throws JSONException;
}

DoRequest(ResultListener resultListener){
mResultListener = resultListener;
}


@Override
protected String doInBackground(String... URL) {
ServiceHandler serviceHandler = new ServiceHandler();
String jsonStr = serviceHandler.makeServiceCall(URL[0]);
return jsonStr;
}

@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
try {
mResultListener.onResultAvailable(result);
} catch (JSONException e) {
e.printStackTrace();
}
}

帮我把APIHelper类的方法改成在DoRequest回调后返回值。

最佳答案

您可以使用像 otto 这样的事件总线让异步任务在 onPostExecute 中向事件总线发布一次事件,然后让 Helper 类将其结果返回给谁,监听总线上的事件,然后处理那里的回调。

http://square.github.io/otto/

使用它的一个例子是:

首先,您必须使用自定义发布方法才能从后台发布到主题。

public class MainThreadBus extends Bus {
private final Handler handler = new Handler(Looper.getMainLooper());

@Override public void post(final Object event) {
if (Looper.myLooper() == Looper.getMainLooper()) {
super.post(event);
} else {
handler.post(new Runnable() {
@Override
public void run() {
post(event);
}
});
}
}
}

现在我们已经设置好,在调用辅助类的类内部,我们在总线上创建一个寄存器并调用辅助方法:

class someClass(){
///some stuff
public void performRestCall(int id_category){
bus.register(this);
ApiHelper.getItemsInCategory(id_category);
}

@Subscribe
public void restCallCompleted(GetCategoryEvent e){
ArrayList<Item> list = e.getList();
//do whatever else you need to
bus.unRegister(this);
}
}

现在在 asyncTask 的 onPostExecute 中,我们执行在 asyncTask 完成后我们正在做的所有工作,并告诉总线上的每个人这个事件已经完成。我们在对象中传递列表而不是从方法中返回它。:

 @Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
bus.register(this);
try {
JSONObject jsonObject = new JSONObject(jsonString);
bus.post(new GetCategoryEvent( Item.fromJson(jsonObject));
} catch (JSONException e) {
e.printStackTrace();
}
}

您的解决方案最终将遵循这些思路。

关于java - 来自 AsyncTask 类的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24714486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com