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;

в приведенном выше коде я хочу сохранить значение ответа.тело.)(string () из метода onResponse () в переменной responseString, однако я не могу получить к нему доступ.

3 ответов


Я думаю, что вы хотите сделать, это что-то вроде этого:

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

в приведенном выше действии мы реализуем обратный вызов, а затем, когда мы создаем запрос okhttp, мы передаем ему экземпляр себя (это), и таким образом мы можем получить oktthp для вызова класса, мы могли бы сделать внутренний класс так же легко, но это уменьшает количество классов, которые мы должны сделать. Я использовал щелчок кнопки, чтобы проиллюстрировать, когда выполняется Http-вызов, но это может быть в другой раз, например, это может произойдет, когда экран будет впервые создан (в onCreate). Будьте осторожны, хотя поворотов экрана. Также предполагается, что обратный вызов выполняется в основном потоке, который, я думаю, будет, но я не уверен, поскольку я использую okttp по-другому, чем вы. Если он не возвращает результаты ответа в основном потоке, вы можете вызвать runOnUiThread() и передать ему Runnable, который выполняет работу по обновлению представлений.


если вы перемещаете responseString объявление переменной экземпляра, тогда вы сможете назначить ее значение в onResponse метод Callback.

public class MyClass {

    private String responseString; 

    // your class implementation

}

Я изменил код, который вы выложили с необходимыми изменениями ниже:

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 {
        responseString = response.body().string();
    }
};

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

первый ответ близок, но вы не можете назначить конечную переменную в методе onResponse. Решение типа final String[] responseString = new String[1]; и назначить responseString[0] = response.body().string();