gpt4 book ai didi

java - OkHttpClient 异步请求的返回值

转载 作者:行者123 更新时间:2023-11-30 05:19:46 27 4
gpt4 key购买 nike

在我的第一个 Android 项目中,我创建了一个 onClick 事件来调用函数:

public void doSomething(View v) {
String result = authenticate();
[...]
}

该函数调用方法:

private String authenticate() {
OkHttpClient client = new OkHttpClient();

[...]

client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
[...]
}

@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
String responseString = response.body().string();

try {
JSONObject responseObject = new JSONObject(responseString);
String responseObjectAccessToken = responseObject.getString("accesstoken");
} catch (JSONException e) {
e.printStackTrace();
}
}
}
});
}

现在我想将 responseObjectAccessToken 返回到我的 doSomething 函数。由于我是 Java 和 Android Studio 的新手,如果有详细的解释就太好了。

最佳答案

一个建议是通过回调来处理异步响应,该回调作为参数传递给您的 authenticate 方法。在这里,我使用 Java 8 lambda 作为该方法接口(interface)。

public class MyActivity extends Activity {
public interface AuthCallback {
void onAuthResult(String token);
}

private String authenticate(AuthCallback callback) {
// ...
String responseObjectAccessToken = responseObject.getString("accesstoken");
callback.onAuthResult(responseObjectAccessToken)
// ...
}

public void doSomething(View v) {
authenticate((token) -> {
// do something with token
});
}

// ...

}

如您所见,如果您愿意,可以存储回调:

// ...
AuthCallback cb = new AuthCallback() {
@Override
public void onAuthResult(String token) {
// do something in the view/fragment/activity
}
}

// then pass it as argument

或者您的类可以实现此接口(interface)并将其自身传递到方法中:

public class MyActivity extends Activity implements AuthCallback {
@Override
public void onAuthResult(String token) {
// do something
}

// ...

public void doSomething(View v) {
authenticate(MyActivity.this); // <-- pass itself
}
}

这里重要的一点是网络发生在单独的线程上,因此如果您想在 API 响应后进行一些 UI 更改,您可以使用辅助方法 runOnUiThread在主 ui 线程上进行更改:

authenticate((token) -> {
runOnUiThread(() -> {
// do something with UI here
})
});

关于java - OkHttpClient 异步请求的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59751746/

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