在 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 从 voidString 的类型不起作用,因为在匿名 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;

}

然后,你可以覆盖这两个抽象方法。