Ok vous essayez d'accéder à l'interface graphique par un autre thread. Ce, dans la principale, n'est pas une bonne pratique.
L'AsyncTask exécute tout en doInBackground()
à l'intérieur d'un autre thread, qui n'ont pas accès à l'interface graphique où votre point de vue.
preExecute()
et postExecute()
vous offrons l'accès à l'interface graphique avant et après le gros du travail se produit dans ce nouveau fil de discussion, vous pouvez même transmettre le résultat de la longue opération postExecute()
pour ensuite afficher tous les résultats du traitement.
Voir ces lignes où, plus tard, vous procurant une TextView:
TextView txt = (TextView) findViewById(R.id.output);
txt.setText("Executed");
les mettre dans PostExecute()
Vous verrez alors vous TextView texte mise à jour après l' doInBackground
complète.
EDIT: j'ai remarqué que votre onClick auditeur ne vérifie pas la Vue qui a été sélectionné. J'ai trouver la meilleure façon de le faire est par l'intermédiaire d'instructions de commutation. J'ai une classe complète édité ci-dessous avec toutes les suggestions afin de sauver la confusion.
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.Settings.System;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.view.View.OnClickListener;
public class AsyncTaskActivity extends Activity implements OnClickListener {
Button btn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button) findViewById(R.id.button1);
// because we implement OnClickListener we only have to pass "this"
// (much easier)
btn.setOnClickListener(this);
}
public void onClick(View view) {
// detect the view that was "clicked"
switch (view.getId()) {
case R.id.button1:
new LongOperation().execute("");
break;
}
}
private class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.interrupted();
}
}
return "Executed";
}
@Override
protected void onPostExecute(String result) {
TextView txt = (TextView) findViewById(R.id.output);
txt.setText("Executed"); // txt.setText(result);
// might want to change "executed" for the returned string passed
// into onPostExecute() but that is upto you
}
@Override
protected void onPreExecute() {}
@Override
protected void onProgressUpdate(Void... values) {}
}
}