Threads em android

Bom galera alguém me ajuda pfv, bom meu app tava parando na execução quando executava determinada tarefa e então adicionei threads segue o codigo aparentemente o código está correto mais o problema continua, alguem pode me ajuda pfv, obrigado desde de já!

// Metodo da ação do botão Calcular
    public void Calculaar(View view) {

        new Thread() {
            public void run() {

                try {

                            String v1 = av1.getText().toString();
                            String v2 = av2.getText().toString();
                            String v3 = av3.getText().toString();
                            String v4 = av4.getText().toString();

                            if (v1.trim().isEmpty() || v2.trim().isEmpty() || v3.trim().isEmpty() || v4.trim().isEmpty()) {
                                AlertDialog.Builder dlg = new AlertDialog.Builder(Tela_Pres.this);
                                dlg.setMessage("Há Dados em Branco!");
                                dlg.setNeutralButton("Ok", null);
                                dlg.show();

                            } else {


                                AV1 = Double.parseDouble(av1.getText().toString());
                                AV2 = Double.parseDouble(av2.getText().toString());
                                AV3 = Double.parseDouble(av3.getText().toString());
                                AV4 = Double.parseDouble(av4.getText().toString());


                                resultado = ((AV1 * 2) + (AV2 * 2) + (AV3 * 1) + (AV4 * 1)) / 6;

                                DecimalFormat formato = new DecimalFormat("#.##");
                                resultado = Double.valueOf(formato.format(resultado));


                                if (resultado < 6) {


                                    resultadoText.setText(String.valueOf("Sua Média: " + resultado + " , Aluno Reprovado"));
                                    AlertDialog.Builder dlg = new AlertDialog.Builder(Tela_Pres.this);
                                    dlg.setMessage("Resultado: " + resultado + " Aluno Reprovado");
                                    dlg.setNeutralButton("Ok", null);
                                    dlg.show();


                                } else {
                                    resultadoText.setText(String.valueOf("Sua Média:  " + resultado + " , Aluno Aprovado"));

                                    AlertDialog.Builder dlg = new AlertDialog.Builder(Tela_Pres.this);
                                    dlg.setMessage("Resultado:   " + resultado + ", Parabéns Aluno Aprovado");
                                    dlg.setNeutralButton("Ok", null);
                                    dlg.show();
                                }
                            }


                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

        }.start();
    }

Você não pode “tocar” na tela a partir de uma outra Thread.
E outras palavras você só pode exibir mensagens(AlertDialogs, Toast, SnackBar, etc…), alterar valores de campos texto (TextView, EditText, etc) apartir da UI Thread (MainThread):

http://developer.android.com/intl/pt-br/guide/components/processes-and-threads.html

A classe AsyncTask te ajuda nessa tarefa.

Seu código ficaria mais ou menos assim:

   // Metodo da ação do botão Calcular
    public void Calculaar(View view) {
        String v1 = av1.getText().toString();
        String v2 = av2.getText().toString();
        String v3 = av3.getText().toString();
        String v4 = av4.getText().toString();

        if (v1.trim().isEmpty() || v2.trim().isEmpty() || v3.trim().isEmpty() || v4.trim().isEmpty()) {
            AlertDialog.Builder dlg = new AlertDialog.Builder(Tela_Pres.this);
            dlg.setMessage("Há Dados em Branco!");
            dlg.setNeutralButton("Ok", null);
            dlg.show();
            return;
        }

        double AV1 = Double.parseDouble(av1.getText().toString());
        double AV2 = Double.parseDouble(av2.getText().toString());
        double AV3 = Double.parseDouble(av3.getText().toString());
        double AV4 = Double.parseDouble(av4.getText().toString());

        AsyncTask<Integer, Void, Double> atCalcular = new AsyncTask<Integer, Void, Double>() {
            @Override
            protected Double doInBackground(Integer... params) {

                try {
                    Double resultado = ((params[0] * 2) + (params[1] * 2) + (params[2] * 1) + (params[3] * 1)) / 6;

                    DecimalFormat formato = new DecimalFormat("#.##");
                    resultado = Double.valueOf(formato.format(resultado));

                    return resultado;

                } catch (Exception e) {
                    e.printStackTrace();
                }

                return null;
            }

            @Override
            protected void onPostExecute(Double resultado) {
                super.onPostExecute(resultado);

                if (resultado < 6) {
                    resultadoText.setText(String.valueOf("Sua Média: " + resultado + " , Aluno Reprovado"));
                    AlertDialog.Builder dlg = new AlertDialog.Builder(Tela_Pres.this);
                    dlg.setMessage("Resultado: " + resultado + " Aluno Reprovado");
                    dlg.setNeutralButton("Ok", null);
                    dlg.show();


                } else {
                    resultadoText.setText(String.valueOf("Sua Média:  " + resultado + " , Aluno Aprovado"));

                    AlertDialog.Builder dlg = new AlertDialog.Builder(Tela_Pres.this);
                    dlg.setMessage("Resultado:   " + resultado + ", Parabéns Aluno Aprovado");
                    dlg.setNeutralButton("Ok", null);
                    dlg.show();
                }
            }
        };
        atCalcular.execute(AV1, AV2, AV3, AV4);
    }
1 curtida

Cara muito obrigado , obrigado mesmo vs tirou todas minhas duvidas,

mais ainda reportou este erro

Ah sim…
Os parâmetros devem ser do tipo double:

AsyncTask<Double, Void, Double> atCalcular = new AsyncTask<Double, Void, Double>() {
        @Override
        protected Double doInBackground(Double... params) {

            try {
                Double resultado = ((params[0] * 2) + (params[1] * 2) + (params[2] * 1) + (params[3] * 1)) / 6;

                DecimalFormat formato = new DecimalFormat("#.##");
                resultado = Double.valueOf(formato.format(resultado));

                return resultado;

            } catch (Exception e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Double resultado) {
            super.onPostExecute(resultado);

            if (resultado < 6) {
                resultadoText.setText(String.valueOf("Sua Média: " + resultado + " , Aluno Reprovado"));
                AlertDialog.Builder dlg = new AlertDialog.Builder(Tela_Pres.this);
                dlg.setMessage("Resultado: " + resultado + " Aluno Reprovado");
                dlg.setNeutralButton("Ok", null);
                dlg.show();


            } else {
                resultadoText.setText(String.valueOf("Sua Média:  " + resultado + " , Aluno Aprovado"));

                AlertDialog.Builder dlg = new AlertDialog.Builder(Tela_Pres.this);
                dlg.setMessage("Resultado:   " + resultado + ", Parabéns Aluno Aprovado");
                dlg.setNeutralButton("Ok", null);
                dlg.show();
            }
        }
    };
    atCalcular.execute(AV1, AV2, AV3, AV4);

Está dando erro por que, no metodo doInBackground ta passando double cm parametro.

Troca a linha AsyncTask atCalcular = new AsyncTask() {

Para:

Editei, agora está certo.

Continuou o erro! :confused:

mais eu fiz isso e o erro continua. rss

conseguir acerta coloque Double.vlueOF e deu certo agr p execute esta me retornando erro pode me ajudar pfv!

Nesse print dá pra perceber que vc alterou o escopo das variaveis AV1, AV2, AV3 E AV4.

1 curtida

não alterei não, so alterei o Async mesmo que vs pediu !

Posta o código da classe da sua classe.