Как получить ответ из 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) {
//твой ответ здесь
}
}
Продвижение своими сайтами как стратегия роста и независимости