Handle Exception in an AsyncTask

1
I use an AsyncTask in the app that works blz, but if the WebService is off the air, it returns that the application stopped, I already tried to handle the exception in several ways but it does not work, as below the Asynctask code working:

private class ConsultaWebServiceCategoria extends AsyncTask<String, Void, String> {
    String Conteudo;
    String erro;
    ProgressDialog progressDialog = new ProgressDialog(getActivity());


    @Override
    protected void onPreExecute() {//responsavel pelo carregamento inicial
        super.onPreExecute();
        progressDialog.setTitle("Por favor aguarde ...");
        progressDialog.setProgressStyle(2);
        progressDialog.setMessage("Carregando dados...");
        progressDialog.show();
    }

    @Override
    protected String doInBackground(String... params) {//responsavel por executar a requisição utilizando os parametros passados
        URL url;
        BufferedReader br = null;
        String registro;

        try {
            url = new URL(params[0]);//url do webservice
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");

            OutputStreamWriter outputStreamWr = new OutputStreamWriter(connection.getOutputStream());
            outputStreamWr.flush();

            br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            StringBuilder sb = new StringBuilder();

            while ((registro = br.readLine()) != null) {
                sb.append(registro);
                sb.append(System.getProperty("line.separator"));
            }
            return sb.toString();

        } catch (MalformedURLException e) {
            erro = e.getMessage();
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            erro = e.getMessage();
            e.printStackTrace();
            return null;
        } finally {
            try {
                br.close();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return null;
            }
        }

    }


    @Override
    protected void onPostExecute(String result) {
        String Conteudo_1 = result;
        String Conteudo_tratado_1 = Conteudo_1.replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<string xmlns=\"http://digits.com.br/\"", "{\"Android\":");
        String Conteudo_2 = Conteudo_tratado_1;
        String Conteudo_tratado_2 = Conteudo_2.replace("string", "}");
        String Conteudo_3 = Conteudo_tratado_2;
        String Conteudo_tratado_3 = Conteudo_3.replaceAll("[</>\n]", "");
        String Conteudo_4 = Conteudo_tratado_3;
        String Conteudo_tratado_4 = Conteudo_4.replace("\", "");
        String Conteudo_5 = Conteudo_tratado_4;
        String Conteudo_tratado_5 = Conteudo_5.replace("Date(", "");
        String Conteudo_6 = Conteudo_tratado_5;
        String Conteudo_tratado_6 = Conteudo_6.replace("0)", "0");
        String Conteudo_7 = Conteudo_tratado_6;
        String Conteudo_tratado_7 = Conteudo_7.replace("null", ".");
        String Conteudo_8 = Conteudo_tratado_7;
        String Conteudo_tratado_8 = Conteudo_8.replace(")", "");


        progressDialog.dismiss();//finalizando a caixa de dialogo do aguarde

        Ac_Df_Categoria_Produto ac_df_categoria_produto = new Ac_Df_Categoria_Produto();

        JSONObject jsonResponse;
        try {
            jsonResponse = new JSONObject(Conteudo_tratado_8);
            JSONArray jsonArray = jsonResponse.optJSONArray("Android");//capturando tag que antecede o resultado que esta no webservices
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject child = jsonArray.getJSONObject(i);
                //alimentando a classe

                ac_df_categoria_produto.setId(child.getInt("PCT_ID_21"));
                ac_df_categoria_produto.setDescricaoInternet(child.getString("PCT_DESCRICAO_INTERNET_21"));
                ac_df_categoria_produto.setPossui_tamanho(child.getString("PCT_POSSUI_TAMANHO_21"));

                processFinishPedido(ac_df_categoria_produto);
            }

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    //@Override
    public void processFinishPedido(Ac_Df_Categoria_Produto ac_df_categoria_produto) {//resultado do OnPostExecute
        //     TextView showParsedJSON = (TextView) findViewById(R.id.showParsedJSON);
        if (ac_df_categoria_produto.getDescricaoInternet() != null) {
            int IdCategoria = ac_df_categoria_produto.getId();
            String NomeCategoria = ac_df_categoria_produto.getDescricaoInternet();
            String PossuiTamanho = ac_df_categoria_produto.getPossui_tamanho();

            Ac_Df_Categoria_Produto p = new Ac_Df_Categoria_Produto(IdCategoria, NomeCategoria, PossuiTamanho);

            categoria_produtoList.add(0, p);

            adapter.notifyDataSetChanged();
            swipeRefreshLayout.setRefreshing(false);

        }
    }
    
asked by anonymous 11.12.2015 / 15:31

1 answer

2

You are treating the error in doInBackground() so that when one happens, the method returns null .

The value returned by doInBackgound() is passed to onPostExecute() method. So the problem is you're trying to use a null value in onPostExecute() .

One solution is to test whether the value received in onPostExecute() is null or not and act accordingly.

@Override
protected void onPostExecute(String result) {
    if(result == null){
        //Deu erro ou não há resultado
    }else{
        //Em principio há um resultado válido.
        //tratar resultado
    }
}
    
11.12.2015 / 15:41