gpt4 book ai didi

java - 使用 AsyncTask 创建回调函数

转载 作者:行者123 更新时间:2023-11-29 19:51:05 25 4
gpt4 key购买 nike

我已经创建了一个 AsyncTask 类来处理来 self 的服务器的发送和接收。我想要做的是在收到数据时触发一个事件或回调,这样我就可以使用所述数据来操纵 UI。

AsyncTask 类:

public class DataCollectClass extends AsyncTask<Object, Void, JSONObject> {
private JSONObject collected;

@Override
protected void onPreExecute() {
super.onPreExecute();
}

//@Override -Commented out because it doesn't like the override
protected void onPostExecute() {
try {
Log.d("Net", this.collected.getString("message"));
} catch (JSONException e) {
e.printStackTrace();
}
}

@Override
protected JSONObject doInBackground(Object... params) {
OkHttpClient client = new OkHttpClient();

// Get Parameters //
String requestURI = (String) params[0];
RequestBody formParameters = (RequestBody) params[1];
Request request = new Request.Builder().url(requestURI).post(formParameters).build();

client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// DO something on FAIL
}

@Override
public void onResponse(Call call, Response response) throws IOException {
String jsonResponse = response.body().string();
Log.d("Net", jsonResponse);
try {
DataCollectClass.this.collected = new JSONObject(jsonResponse);
Log.d("Net", DataCollectClass.this.collected.getString("message"));
} catch (JSONException e) {
e.printStackTrace();
}
}
});

return collected;
}
}

这是有效的,它将预期的 JSON 行打印到日志中。

它从 Activity 中调用为:

new DataCollectClass().execute(requestURI, formVars);

我查看了所有内容,但似乎无法找到有关如何(以及在​​何处)添加回调的明确答案。回调代码本身最好包含在 DataCollectClass 中,这样所有相关代码都可以在同一个地方重用。

有没有办法创建程序可以监听的自定义事件触发(类似于 Javascript 库)?

我一直在为这个而烦恼!

更新:

由于 AsyncTask 是多余的,我将其删除并重写了代码(以防其他人遇到同样的问题):

公共(public)类 DataCollectClass { 收集私有(private) JSONObject;

    public interface OnDataCollectedCallback {
void onDataCollected(JSONObject data);
}

private OnDataCollectedCallback mCallback;

public DataCollectClass(OnDataCollectedCallback callback, String requestURI, RequestBody formParameters){
mCallback = callback;
this.collect(requestURI, formParameters);
}

public JSONObject collect(String requestURI, RequestBody formParameters) {
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder().url(requestURI).post(formParameters).build();

client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//TODO Add what happens when shit fucks up...
}

@Override
public void onResponse(Call call, Response response) throws IOException {
String jsonResponse = response.body().string();
Log.d("Net", jsonResponse);
try {
DataCollectClass.this.collected = new JSONObject(jsonResponse);

if(mCallback != null)
mCallback.onDataCollected(DataCollectClass.this.collected);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
return collected;
}
}

从 Activity 调用:

new DataCollectClass(new DataCollectClass.OnDataCollectedCallback() {
@Override
public void onDataCollected(JSONObject data) {
if(data != null) {
try {
// Do Something //
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}, requestURI, formVars);

一切正常!谢谢!

最佳答案

如果您想为 AsyncTask 使用回调,您可以通过以下方式处理它。

做这样的事情(修改你的代码以添加下面的内容)

public class DataCollectClass extends AsyncTask<Object, Void, JSONObject> {

public interface OnDataCollectedCallback{
void onDataCollected(JSONObject data);
}

private OnDataCollectedCallback mCallback;

public DataCollectClass(OnDataCollectedCallback callback){
mCallback = callback;
}

// your code that is already there
...

@Override
public onPostExecute(JSONObject response){
if(mCallback != null)
mCallback.onDataCollected(response);
}
}

然后让魔法发生

new DataCollectClass(new OnDataCollectedCallback() {
@Override
public void onDataCollected(JSONObject data) {
if(data != null)
// DO something with your data
}
}).execute(requestURI, formVars);

但是,值得注意的是,大多数网络库(包括 OkHttp)都在内部处理后台线程,并包含用于处理请求的回调。

这也实现了一个自定义接口(interface),因此其他人可能会看到您如何将它用于任何 AsyncTask。

关于java - 使用 AsyncTask 创建回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37146854/

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