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