Android如何使用OkHttp从Callback获取响应字符串?

时间:2015-06-30 18:32:02

标签: java android okhttp

这是我的代码:

    OkHttpClient okHttpClient = new OkHttpClient();

    Request request = new Request.Builder().url("http://publicobject.com/helloworld.txt").build();

    Callback callback = new Callback() {
        @Override
        public void onFailure(Request request, IOException e) {

        }

        @Override
        public void onResponse(Response response) throws IOException {

        }
    };

    okHttpClient.newCall(request).enqueue(callback);

    String responseString;

在上面的代码中,我想在变量responseString中的onResponse()方法中存储response.body()。string()的值,但是我无法访问它。

3 个答案:

答案 0 :(得分:4)

我认为你想要做的是这样的事情:

public class MyActivity extends Activity implements Callback , View.OnClickListener {


 @Override
 public void onCreate(Bundle savedState) {
   super.onCreate(savedState);
   findViewById(R.id.DoHttp).setOnClickListener(this);
 } 

 @Override
 public void onClick(View v) {
   if (v.getId(() == R.id.DoHttp) {

     OkHttpClient okHttpClient = new OkHttpClient();

     Request request = new Request.Builder().url("http://publicobject.com/helloworld.txt").build();
     okHttpClient.newCall(request).enqueue(this);
   }
 }


 @Override
 public void onFailure(Request request, IOException e) {
  //do something to indicate error
 }

  @Override
  public void onResponse(Response response) throws IOException {
    if (response.isSuccessful()) {
     parse(response.body().string());
    }
  }

  private void parse(String response) {
   //do something with response
  } 
}

在上面的活动中我们实现了Callback,然后当我们创建okhttp请求时,我们传递一个selfelf(this)的实例,这样我们就可以得到oktthp来回调类,我们可以做一个内部类只是很容易,但这减少了我们必须做的类。我使用了一个按钮点击来说明何时进行Http调用,但这可能是其他时间,例如它可能在首次创建屏幕时发生(在onCreate中)。屏幕旋转时要小心。此外,这假设回调是在主线程上完成的,我认为它会是,但我并不积极,因为我以不同于你的方式使用okttp。如果它没有在主线程上的响应上返回结果,那么你可以调用runOnUiThread()并传递一个Runnable来完成更新视图的工作。

答案 1 :(得分:2)

如果您将responseString声明移动为实例变量,那么您将能够使用onResponse的{​​{1}}方法分配其值。

Callback

我修改了您发布的代码,并进行了以下必要的更改:

public class MyClass {

    private String responseString; 

    // your class implementation

}

答案 2 :(得分:1)

第一个答案是关闭,但你不能在方法onResponse中分配最终变量。解决方法是键入final String[] responseString = new String[1];并指定responseString[0] = response.body().string();