Как получить ответ из POST запроса, заранее спасибо Вызов в мэйне:
new DoPOSTInBackground().execute(key)
String[] key = {"qwerty"};
Сам класс:
package com.admin.post;
import android.os.AsyncTask;
import java.io.IOException;
import java.util.ArrayList;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
class DoPOSTInBackground extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... keys) {
OkHttpClient client = new OkHttpClient();
RequestBody formBody = new FormBody.Builder()
.add("name_form", "key_client")
.add("key", keys[0])
.build();
Request request = new Request.Builder()
.url("http://example.ru/index.php")
.post(formBody).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
System.out.println(response.body().string());
}
});
return null;
}
}
Вы сделали лишнюю работу. Вы создали асинхронную задачу и в ней асинхронно шлёте запрос. Вам досточно всего одной асинхронности. Т.е. или убрать асинхронный вызов запроса к серверу или убрать АсинкТаск вообще.
Ладно, распишу оба варианта.
Вариант 1. Использование класса AsyncTask
класс DoPOSTInBackground
class DoPOSTInBackground extends AsyncTask<String, Void, String> {
//сюда будет помещен ответ от сервера
private String mResponseString;
//слушатель событий, будет оповещен, когда запрос закончит выполняться.
private PostRequestListener postRequestListener;
public void setPostRequestListener(PostRequestListener postRequestListener) {
this.postRequestListener = postRequestListener;
}
@Override
protected String doInBackground(String... keys) {
OkHttpClient client = new OkHttpClient();
RequestBody formBody = new FormBody.Builder()
.add("name_form", "key_client")
.add("key", keys[0])
.build();
DownloadManager.Request request = new Request.Builder()
.url("http://example.ru/index.php")
.post(formBody).build();
//doInBackground вызывается в отдельном потоке, значит
//execute() можно вызывать прямо здесь.
//Метод enqueue(), в отличие от него, вызывается в отдельном потоке
//поэтому в данном случае нет смысла этого делать.
client.newCall(request).execute();
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
//onPostExecute вызывается на главном потоке, поэтому никаких проблем
//нет, можно отправлять событие слушателю.
if (postRequestListener != null)
{
postRequestListener.onResponse(mResponseString);
}
}
public interface PostRequestListener{
void onResponse(String response);
}
}
Активити или фрагмент
public class ActivityOrFragment implements DoPOSTInBackground.PostRequestListener {
void makeRequest(){
DoPOSTInBackground task = new DoPOSTInBackground().execute();
task.setPostRequestListener(this);
}
@Override
public void onResponse(String response) {
//твой придет сюда.
}
}
Вариант 2. Без использования AsyncTask
class CoreOkHttpPost {
//слушатель событий, будет оповещен, когда запрос закончит выполняться.
private PostRequestListener postRequestListener;
public void setPostRequestListener(PostRequestListener postRequestListener) {
this.postRequestListener = postRequestListener;
}
public void makePostRequest(){
OkHttpClient client = new OkHttpClient();
RequestBody formBody = new FormBody.Builder()
.add("name_form", "key_client")
.add("key", keys[0])
.build();
DownloadManager.Request request = new Request.Builder()
.url("http://example.ru/index.php")
.post(formBody).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
System.out.println("post request failed");
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
//берем ответ от сервера
final String responseString = response.body().string();
//Так как enqueue выполняется в отдельном потоке, соответственно
//onResponse тоже будет выполнен в том же (отдельном от главного) потоке.
//Активити и фрагменты не любят когда трогают View-элементы не в main потоке,
//поэтому решаем эту проблему Handler'ом. Иначе будет Exception.
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
notifyRequestExecuted(responseString);
}
});
}
});
}
//оповещение можно вынести в отдельный метод
private void notifyRequestExecuted(String response){
if (postRequestListener != null)
{
postRequestListener.onResponse(response);
}
}
public interface PostRequestListener{
void onResponse(String response);
}
}
Активити или фрагмент
public class ActivityOrFragment implements CoreOkHttpPost.PostRequestListener {
void makeRequest(){
CoreOkHttpPost coreOkHttpPost = new CoreOkHttpPost();
coreOkHttpPost.makePostRequest();
coreOkHttpPost.makePostRequest();
}
@Override
public void onResponse(String response) {
//твой ответ здесь
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Компилятор вообще не создает экземпляры обобщенного класса или компилятор не создает более одного экземпляра обобщенного класса?
У меня есть метод для деления многочленов с остаткомОн хорошо работает для многочленов, коэффициенты которых делятся точно
Делаю игру точки, есть rectangle dot(сама точка), хочу сделать, что бы при нажатии на ту или иную кнопку, dot меня свой цвет на красный/синий, но когда...