【问题标题】:How to get response data back to main class while using asynchronous in Okhttp android Library?在 Okhttp android 库中使用异步时如何将响应数据返回到主类?
【发布时间】:2016-01-06 16:25:08
【问题描述】:

我无法找出正确的方法。首先让我们看一下代码:

//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();

        }
    });
}

这个方法在一个普通类中,不是一个活动,我想做的是我希望这个方法返回jSondata,只需将返回类型从void更改为String不起作用,因为,在匿名类中也发生在其他线程中,我需要在其他方法中分配这个 jSonData 变量,该方法将从片段中调用。 所以,让我知道我是否可以将变量从这里传递给同一个主类中的其他方法。

【问题讨论】:

  • 如果此方法与需要数据的其他方法在同一个类中,那么您只需从该方法返回您在onResponse 中设置的字符串并将其传递给下一个方法。因此,您只需致电theOtherMethod(fetchJsonData(url));。另一种选择是在类中定义一个名为 String jsonResponse 的全局变量,然后在您的 fetchJsonData 方法中分配它。

标签: java android multithreading anonymous okhttp


【解决方案1】:

创建方法失败,您的活动成功。这样做的好方法是创建一个接口并让活动实现该接口。 方法是:

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);
            }
        }
    });
}

【讨论】:

  • 我创建了一个接口,其中有两种方法失败和成功,并在我的片段中实现。我将 getActivity() 从我的片段类传递给此方法,但在此方法中... activity.failed() 和 activity.success(jSonData) 无法识别。我对 WeakReference 了解不多,但我还是按照你说的做了。
  • 所以在这里传递你的片段而不是活动,并相应地更改上面的代码
  • 对不起,我通过了“this”而不是 getActivity() .. 现在它可以工作了。谢谢。我从来不知道弱引用。
  • 弱引用是为了防止可能的内存泄漏,即如果活动或片段停止或暂停时返回数据
  • 顺便说一句,我必须创建接口对象来访问这些方法,不能使用活动或片段对象直接访问。
【解决方案2】:

创建你自己的回调接口。

像这样:

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;

}

然后,您可以重写这两个抽象方法。

【讨论】:

    猜你喜欢
    • 2018-10-12
    • 2014-07-18
    • 2022-01-19
    相关资源
    最近更新 更多