Обработка ошибок в Android Java

223
02 декабря 2017, 09:13

Проблема такая: пишу приложения с соединением с сервером. Делаю простой 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);
}

Что скажете?

Answer 1

Нельзя изменять UI из фонового потока - у Вас это все вызовы callBack в doInBackground
Работу с UI нужно переводить в главный поток с помощью Handler или Activity.runOnUiThread() или View.post().
Или вызывать callback в onPostExecute. Для этого нужно либо возвращать в doInBackground специальное значение при ошибке и проверять его в onPostExecute, либо записывать ошибку в поле и проверять это поле.

READ ALSO
Jasperreports &amp; Google Crome

Jasperreports & Google Crome

Есть следующий код по формированию отчетов в форматах PDF и XLSПри этом, содержимое файла report_name

277
Java, графические библиотеки

Java, графические библиотеки

Подскажите библиотеку для 3д графики, желательно простуюНужно отобразить xyz-систему координат и разместить в ней множество сфер, некоторые...

275
Как создать gridlayout manager подобный этому?

Как создать gridlayout manager подобный этому?

Столкнулся с проблемой, хотел создать grid layout подобный этому но спустя несколько дней так и не смог это реализовать, может кто-то сталкивался...

220
Работа с Timestamp

Работа с Timestamp

В базе хранится дата в формате TIMESTAMPВ базе записана вот эта дата

235