Проблема такая: пишу приложения с соединением с сервером. Делаю простой AsyncTask
с Callback. Все хорошо но при проблеме с соединением у меня не обрабатывается как положено а просто выкидывает. Вот код запроса:
package com.example.drawer.drawer;
import android.content.Context;
import android.os.AsyncTask;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* Created by user on 29.11.2017.
*/
public class AsyncQuery extends AsyncTask<String, String, String> {
private Context context;
private String postParams;
private Callback callBack;
private String constUrl;
AsyncQuery(Context c, String url, String p, Callback back){
context = c;
postParams = p;
callBack = back;
constUrl = url;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
try {
String myURL = constUrl;
String param = postParams;
byte[] data = null;
InputStream is = null;
try {
URL url = new URL(myURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestProperty("Content-Length", "" + Integer.toString(param.getBytes().length));
OutputStream os = conn.getOutputStream();
data = param.getBytes("UTF-8");
os.write(data);
data = null;
conn.connect();
int responseCode= conn.getResponseCode();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if (responseCode == 200) {
is = conn.getInputStream();
byte[] buffer = new byte[8192]; // Такого вот размера буфер
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
baos.write(buffer, 0, bytesRead);
}
data = baos.toByteArray();
String rs = new String(data, "UTF-8");
return rs;
}else{
callBack.onReqFail(false);
return null;
}
} catch (MalformedURLException e) {
callBack.onFail("MalformedURLException:");
return null;
} catch (IOException e) {
callBack.onFail("IOException:");
return null;
} catch (Exception e) {
callBack.onFail("Exception:");
return null;
}
} catch (Exception e) {
e.printStackTrace();
callBack.onFail("Exception:");
return null;
}
}
@Override
protected void onPostExecute( String rs) {
super.onPostExecute(rs);
if (rs != null){
callBack.onSuccess(rs);
}
}
}
А вот код Сallback обработки:
@Override
public void onReqFail(Boolean str){
if (str == false){
TextView txt = (TextView) findViewById(R.id.statusForQuery);
txt.setText("Ошибка сети проверте подключения к интернету");
}
}
@Override
public void onFail(String rs) {
TextView txt = (TextView) findViewById(R.id.statusForQuery);
txt.setText(rs);
}
Что скажете?
Нельзя изменять UI из фонового потока - у Вас это все вызовы callBack
в doInBackground
Работу с UI нужно переводить в главный поток с помощью Handler или Activity.runOnUiThread()
или View.post()
.
Или вызывать callback
в onPostExecute
. Для этого нужно либо возвращать в doInBackground
специальное значение при ошибке и проверять его в onPostExecute
, либо записывать ошибку в поле и проверять это поле.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть следующий код по формированию отчетов в форматах PDF и XLSПри этом, содержимое файла report_name
Подскажите библиотеку для 3д графики, желательно простуюНужно отобразить xyz-систему координат и разместить в ней множество сфер, некоторые...
Столкнулся с проблемой, хотел создать grid layout подобный этому но спустя несколько дней так и не смог это реализовать, может кто-то сталкивался...