Treat exception in an Asynctask

Asked

Viewed 308 times

1

I use a Asynctask in the app that works blz, however if the Webservice is out of the air, it returns that the application has stopped, I have tried to treat the exception in several ways but it does not work, below the code of Asynctask 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);

        }
    }

1 answer

2


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

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

A solution is to test whether the value received in the onPostExecute() is void or not and acts 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
    }
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.