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();
}
me1
Março 17, 2016, 5:35pm
#2
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
me1
Março 17, 2016, 6:41pm
#4
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.
me1
Março 17, 2016, 7:22pm
#6
Troca a linha AsyncTask atCalcular = new AsyncTask() {
Para:
me1:
AsyncTask<Double, Void, Double> atCalcular = new AsyncTask<Double, Void, Double>() {
Editei, agora está certo.
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!
me1
Março 21, 2016, 12:15pm
#12
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 !
me1
Março 21, 2016, 5:54pm
#14
Posta o código da classe da sua classe.