在 Okhttp android 库中使用异步时如何将响应数据返回到 main class?
How to get response data back to main class while using asynchronous in Okhttp android Library?
我想不出正确的方法。先来看代码:
//This method Fetch raw json Data
public void fetchJsonData(String url){
OkHttpClient client = new OkHttpClient();
Request req = new Request.Builder()
.url(url)
.build();
Call call = client.newCall(req);
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(Response response) throws IOException {
jSonData = response.body().string();
}
});
}
这个方法是一个正常的 class 而不是 activity 我想做的是我想要这个方法 return jSondata
,简单地改变return 从 void
到 String
的类型不起作用,因为在匿名 class 中也发生在其他线程中,我需要分配这个 jSonData
变量在将从片段调用的其他方法中。
所以,让我知道我是否可以将变量从这里传递到同一个 main class.
中的其他方法
在您的 activity 中创建方法失败并成功。好的方法是创建一个接口并让 activity 实现该接口。
方法是:
activity.failed(/*pass failure reasons*/);
和
activity.success(String data);
现在将您的方法更改为:
public void fetchJsonData(Activity activity,String url){
final WeakReference<Activity> activityWeakReference = new WeakReference<Activity>(activity);
OkHttpClient client = new OkHttpClient();
Request req = new Request.Builder()
.url(url)
.build();
Call call = client.newCall(req);
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
Activity activity = activityWeakReference.get();
if (activity != null) {
activity.failed();
}
}
@Override
public void onResponse(Response response) throws IOException {
jSonData = response.body().string();
Activity activity = activityWeakReference.get();
if (activity != null) {
activity.success(jSonData);
}
}
});
}
创建您自己的回调接口。
像这样:
public abstract class MyCallback implements Callback {
private final Handler h = new Handler(Looper.getMainLooper());
@Override
public void onFailure(final Request request, final IOException e) {
h.post(new Runnable() {
@Override
public void run() {
onFailureInMainThread(request, e);
}
});
}
@Override
public void onResponse(final Response response) throws IOException {
h.post(new Runnable() {
@Override
public void run() {
try {
onResponseInMainThread(response);
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
public abstract void onFailureInMainThread(Request request, IOException e);
public abstract void onResponseInMainThread(Response response) throws IOException;
}
然后,你可以覆盖这两个抽象方法。
我想不出正确的方法。先来看代码:
//This method Fetch raw json Data
public void fetchJsonData(String url){
OkHttpClient client = new OkHttpClient();
Request req = new Request.Builder()
.url(url)
.build();
Call call = client.newCall(req);
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(Response response) throws IOException {
jSonData = response.body().string();
}
});
}
这个方法是一个正常的 class 而不是 activity 我想做的是我想要这个方法 return jSondata
,简单地改变return 从 void
到 String
的类型不起作用,因为在匿名 class 中也发生在其他线程中,我需要分配这个 jSonData
变量在将从片段调用的其他方法中。
所以,让我知道我是否可以将变量从这里传递到同一个 main class.
在您的 activity 中创建方法失败并成功。好的方法是创建一个接口并让 activity 实现该接口。 方法是:
activity.failed(/*pass failure reasons*/);
和
activity.success(String data);
现在将您的方法更改为:
public void fetchJsonData(Activity activity,String url){
final WeakReference<Activity> activityWeakReference = new WeakReference<Activity>(activity);
OkHttpClient client = new OkHttpClient();
Request req = new Request.Builder()
.url(url)
.build();
Call call = client.newCall(req);
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
Activity activity = activityWeakReference.get();
if (activity != null) {
activity.failed();
}
}
@Override
public void onResponse(Response response) throws IOException {
jSonData = response.body().string();
Activity activity = activityWeakReference.get();
if (activity != null) {
activity.success(jSonData);
}
}
});
}
创建您自己的回调接口。
像这样:
public abstract class MyCallback implements Callback {
private final Handler h = new Handler(Looper.getMainLooper());
@Override
public void onFailure(final Request request, final IOException e) {
h.post(new Runnable() {
@Override
public void run() {
onFailureInMainThread(request, e);
}
});
}
@Override
public void onResponse(final Response response) throws IOException {
h.post(new Runnable() {
@Override
public void run() {
try {
onResponseInMainThread(response);
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
public abstract void onFailureInMainThread(Request request, IOException e);
public abstract void onResponseInMainThread(Response response) throws IOException;
}
然后,你可以覆盖这两个抽象方法。