GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Erro Estranho No Android

android
Tags: #<Tag:0x00007f1b269eea88>

#1

Bom estava com um projeto praticamente terminado em Android com o cliente testando e já dando OK para só mudar algumas imagens e texto do programa nada de mais, aí fui pegar esses dias novamente para testar o programa sem alterar nada ainda e não funciona mais sem eu fazer simplesmente nada, nem o programa que estava no meu celular funcionando também não funciona mais. O erro é o seguinte abaixo:

11-05 16:06:31.691 3926-4274/br.com.escconsultoria.escoficina E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: br.com.escconsultoria.escoficina, PID: 3926
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: java.lang.RuntimeException: Can’t create handler inside thread that has not called Looper.prepare()
at android.os.Handler.(Handler.java:200)
at android.os.Handler.(Handler.java:114)
at android.widget.Toast$TN.(Toast.java:327)
at android.widget.Toast.(Toast.java:92)
at android.widget.Toast.makeText(Toast.java:241)
at br.com.escconsultoria.escoficina.view.MainActivity$FindByCpfClienteAsyncTask.doInBackground(MainActivity.java:151)
at br.com.escconsultoria.escoficina.view.MainActivity$FindByCpfClienteAsyncTask.doInBackground(MainActivity.java:108)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)

Minha classe abaixo aonde está dando erro:

public class MainActivity extends Activity {

private EditText editTextCPF;
private Button buttonConsultar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //Carrega Os Campos Da Tela
    editTextCPF = findViewById(R.id.editTextCPF);
    buttonConsultar = findViewById(R.id.buttonConsultar);

    buttonConsultar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Context context = getApplicationContext();
            int time = Toast.LENGTH_SHORT;

            if (editTextCPF.getText().toString().isEmpty()) {
                String message = "Informe O CPF Para Entrar No Sistema.";

                Toast toast = Toast.makeText(context, message, time);
                toast.show();
            } else if (editTextCPF.getText().length() > 11) {
                String message = "O CPF É Maior Que 11 Dígitos.";

                Toast toast = Toast.makeText(context, message, time);
                toast.show();
            } else if (editTextCPF.getText().length() < 11) {
                String message = "O CPF É Menor Que 11 Dígitos.";

                Toast toast = Toast.makeText(context, message, time);
                toast.show();
            } else if (editTextCPF.getText().toString().isEmpty() == false) {

                try {

                    FindByCpfClienteAsyncTask findByCpfClienteModelAsyncTask = new FindByCpfClienteAsyncTask();
                    findByCpfClienteModelAsyncTask.execute("https://escoficinawebservice.herokuapp.com/cliente/" + editTextCPF.getText());

                    ClienteSaidaDTO clienteSaidaDTO = findByCpfClienteModelAsyncTask.get();

                    if (clienteSaidaDTO.getCode().equals(1)) {
                        String message = "CPF Encontrado.";

                        Toast toast = Toast.makeText(context, message, time);
                        toast.show();

                        message = "Buscando As Informações Do Cliente.";

                        toast = Toast.makeText(context, message, time);
                        toast.show();

                        Intent intentESCOficinaActivity = new Intent(MainActivity.this, ESCOficinaActivity.class);
                        intentESCOficinaActivity.putExtra("clienteSaidaDTO", new Gson().toJson(clienteSaidaDTO));
                        startActivity(intentESCOficinaActivity);

                    } else {
                        String message = "CPF Não Encontrado.";

                        Toast toast = Toast.makeText(context, message, time);
                        toast.show();
                    }
                } catch (Exception e) {
                    String message = "Erro: " + e.getMessage();

                    Toast toast = Toast.makeText(context, message, time);
                    toast.show();
                }
            }
        }
    });
}

class FindByCpfClienteAsyncTask extends AsyncTask<String, Void, ClienteSaidaDTO> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        Context context = getApplicationContext();

        String message = "Aguarde... Verificando CPF.";
        int time = Toast.LENGTH_SHORT;

        Toast toast = Toast.makeText(context, message, time);
        toast.show();
    }

    @Override
    protected ClienteSaidaDTO doInBackground(String... params) {
        String urlString = params[0];

        HttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(urlString);

        ClienteSaidaDTO clienteSaidaDTO = null;

        try {
            HttpResponse response = httpClient.execute(httpGet);

            HttpEntity httpEntity = response.getEntity();

            if (httpEntity != null) {
                InputStream inputStream = httpEntity.getContent();

                String json = toString(inputStream);
                inputStream.close();

                clienteSaidaDTO = getCliente(json);
            }
        } catch (Exception e) {
            Context context = getApplicationContext();
            int time = Toast.LENGTH_SHORT;

            String message = "Erro: " + e.getMessage();

            Toast toast = Toast.makeText(context, message, time);
            toast.show();

            return null;
        }

        return clienteSaidaDTO;
    }

    private ClienteSaidaDTO getCliente(String jsonString) {

        ClienteSaidaDTO clienteSaidaDTO = new ClienteSaidaDTO();

        try {
            JSONObject jsonObjectConvertString = new JSONObject(jsonString);
            JSONObject jsonObjectEntity = jsonObjectConvertString.getJSONObject("entity");
            JSONObject jsonObjectClienteModel = jsonObjectEntity.getJSONObject("clienteModel");

            ClienteModel clienteModel = new ClienteModel();

            clienteSaidaDTO.setCode(jsonObjectEntity.getInt("code"));
            clienteSaidaDTO.setMessage(jsonObjectEntity.getString("message"));

            clienteModel.setCodigoCliente(jsonObjectClienteModel.getInt("codigoCliente"));
            clienteModel.setNomeCliente(jsonObjectClienteModel.getString("nomeCliente"));
            clienteModel.setCpfCliente(jsonObjectClienteModel.getString("cpfCliente"));
            clienteModel.setRgCliente(jsonObjectClienteModel.getString("rgCliente"));
            clienteModel.setEmailCliente(jsonObjectClienteModel.getString("emailCliente"));

            Long dataCadastrocliente = jsonObjectClienteModel.getLong("dataCadastroCliente");
            clienteModel.setDataCadastroCliente(new Date(dataCadastrocliente));

            Long dataNascimentoCliente = jsonObjectClienteModel.getLong("dataNascimentoCliente");
            clienteModel.setDataNascimentoCliente(new Date(dataNascimentoCliente));

            if (jsonString.contains("dddCelular1Cliente")) {
                clienteModel.setDddCelular1Cliente(jsonObjectClienteModel.getInt("dddCelular1Cliente"));
            }

            if (jsonString.contains("numeroCelular1Cliente")) {
                clienteModel.setNumeroCelular1Cliente(jsonObjectClienteModel.getString("numeroCelular1Cliente"));
            }

            if (jsonString.contains("dddCelular2Cliente")) {
                clienteModel.setDddCelular2Cliente(jsonObjectClienteModel.getInt("dddCelular2Cliente"));
            }

            if (jsonString.contains("numeroCelular2Cliente")) {
                clienteModel.setNumeroCelular2Cliente(jsonObjectClienteModel.getString("numeroCelular2Cliente"));
            }

            if (jsonString.contains("dddTelefoneCliente")) {
                clienteModel.setDddTelefoneCliente(jsonObjectClienteModel.getInt("dddTelefoneCliente"));
            }

            if (jsonString.contains("numeroTelefoneCliente")) {
                clienteModel.setNumeroTelefoneCliente(jsonObjectClienteModel.getString("numeroTelefoneCliente"));
            }

            clienteSaidaDTO.setClienteModel(clienteModel);

        } catch (JSONException e) {
            Context context = getApplicationContext();
            int time = Toast.LENGTH_SHORT;

            String message = "Erro: " + e.getMessage();

            Toast toast = Toast.makeText(context, message, time);
            toast.show();

            return null;
        }

        return clienteSaidaDTO;
    }

    private String toString(InputStream is) throws IOException {

        byte[] bytes = new byte[1024];
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int lidos;
        while ((lidos = is.read(bytes)) > 0) {
            baos.write(bytes, 0, lidos);
        }
        return new String(baos.toByteArray());
    }
  }
}

#2

Eu já tive um problema parecido. O app funcionava bem até que descobri que se a sincronização de dados demorar e a tela bloquear por inatividade a task gera um errro.

Para resolver esse problema no meu app quando a executo a task bloqueio para que a tela não desligue e no final da execucção da task libero a tela para ela poder desligar novamente.

https://developer.android.com/training/scheduling/wakelock.html