Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Okhttp android库中使用异步时,如何将响应数据返回到主类?_Java_Android_Multithreading_Anonymous_Okhttp - Fatal编程技术网

Java 在Okhttp android库中使用异步时,如何将响应数据返回到主类?

Java 在Okhttp android库中使用异步时,如何将响应数据返回到主类?,java,android,multithreading,anonymous,okhttp,Java,Android,Multithreading,Anonymous,Okhttp,我想不出做这件事的正确方法。首先让我们看一下代码: //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 = cli

我想不出做这件事的正确方法。首先让我们看一下代码:

//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
变量,该方法将从片段中调用。
所以,请告诉我是否有其他方法可以将变量从这里传递到同一主类中的其他方法。

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

activity.failed(/*pass failure reasons*/);

现在将方法更改为:

 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 void fetchJsonData(活动,字符串url){
最终WeakReference活动WeakReference=新的WeakReference(活动);
OkHttpClient=新的OkHttpClient();
Request req=new Request.Builder()
.url(url)
.build();
Call Call=客户机。新呼叫(req);
call.enqueue(新回调(){
@凌驾
公共void onFailure(请求,IOE异常){
Activity=activityWeakReference.get();
if(活动!=null){
activity.failed();
}
}
@凌驾
public void onResponse(Response-Response)引发IOException{
jSonData=response.body().string();
Activity=activityWeakReference.get();
if(活动!=null){
活动。成功(jSonData);
}
}
});
}

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

activity.failed(/*pass failure reasons*/);

现在将方法更改为:

 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 void fetchJsonData(活动,字符串url){
最终WeakReference活动WeakReference=新的WeakReference(活动);
OkHttpClient=新的OkHttpClient();
Request req=new Request.Builder()
.url(url)
.build();
Call Call=客户机。新呼叫(req);
call.enqueue(新回调(){
@凌驾
公共void onFailure(请求,IOE异常){
Activity=activityWeakReference.get();
if(活动!=null){
activity.failed();
}
}
@凌驾
public void onResponse(Response-Response)引发IOException{
jSonData=response.body().string();
Activity=activityWeakReference.get();
if(活动!=null){
活动。成功(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;
}


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

创建自己的回调接口

像这样:

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


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

如果此方法与需要数据的另一个方法在同一个类中,那么您只需从该方法返回在
onResponse
中设置的字符串,并将其传递到下一个。因此,您只需调用TheTheTheTheherMethod(fetchJsonData(url))。另一个选项是在类中定义一个名为
String jsonResponse
的全局变量,并在
fetchJsonData
方法中分配它。如果此方法与需要数据的其他方法在同一类中,然后,您只需从该方法返回在
onResponse
中设置的字符串,并将其传递到下一个。因此,您只需调用TheTheTheTheherMethod(fetchJsonData(url))。另一个选项是在类中定义一个名为
String jsonResponse
的全局变量,然后在
fetchJsonData
方法中分配它。我创建了一个接口,其中有两个方法失败和成功,并在我的片段中实现。我正在将getActivity()从片段类传递给这个方法,但在这个方法中。。。无法识别activity.failed()和activity.success(jSonData)。我对WeakReference知之甚少,但我还是照你说的做了。因此,我没有在这里传递活动片段,而是相应地修改了上面的代码。对不起,我传递了“this”而不是getActivity()。。现在它开始工作了。谢谢我从来不知道WeakReference。WeakReference是为了防止可能的内存泄漏,即如果活动或片段停止或暂停时返回数据,我必须创建接口对象来访问这些方法,无法使用活动或片段对象直接访问。我创建了一个接口,其中有两个方法失败和成功,并在片段中实现。我正在将getActivity()从片段类传递给这个方法,但在这个方法中。。。无法识别activity.failed()和activity.success(jSonData)。我对WeakReference知之甚少,但我还是照你说的做了。因此,我没有在这里传递活动片段,而是相应地修改了上面的代码。对不起,我传递了“this”而不是getActivity()。。现在它开始工作了。谢谢我从来不知道WeakReference。WeakReference是为了防止可能的内存泄漏,也就是说,如果活动或片段停止或暂停时返回的数据(我必须创建接口对象来访问这些方法),则无法使用活动或片段对象直接访问这些数据。