La mise à jour de TextView de Async Tâche qui utilisent le programme personnalisé de dialogue
Dans l'une de mes applications, j'ai un scénario où j'ai besoin de faire quelques tâches d'arrière-plan. Pour faire ce que je suis en utilisant Async Tâche. Aussi je suis à l'aide personnalisé de la boîte de dialogue de progression. Ci-dessous est le tracé de la personnalisé de la boîte de dialogue de progression
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical|center_horizontal"
android:orientation="vertical" >
<ProgressBar
android:layout_width="60dp"
android:layout_height="60dp"
android:indeterminateDrawable="@drawable/progressloader"
android:layout_gravity="center"/>
<TextView
android:id="@+id/progressMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:textSize="18sp"
android:text="Please wait...." />
</LinearLayout>
Tout fonctionne bien mais quand j'ai essayer de mettre le texte à TextView puis je suis arriver java NullPointerException.
AsyncTask code
private class InitialSetup extends AsyncTask<String, Integer, Long> {
ProgressDialog dialog = new ProgressDialog(getParent(),R.style.progressdialog);
@Override
protected void onPreExecute() {
dialog.show();
dialog.setContentView(R.layout.progressbar);
}
@Override
protected Long doInBackground(String... urls) {
// txtView.setText("Testing"); here I am getting the error
fetchDetails();
return 0;
}
@Override
protected void onPostExecute(Long result) {
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
populateUI(getApplicationContext());
}
}
MainActivity
public class SummaryActivity extends Activity {
final TextView txtView = (TextView)findbyid(R.id.progressMessage);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.accountsummary);
new InitialSetup().execute("");
}
}
Pourrais-tu éditer ton post et ajouter le code de votre Asynctask? Aussi, il serait utile d'ajouter la ligne où NullPointerException se produit.
Veuillez voir le modifier
Veuillez voir le modifier
OriginalL'auteur CrazyCoder | 2012-04-17
Vous devez vous connecter pour publier un commentaire.
Si je comprends bien, votre
TextView
dont vous souhaitez définir le texte peut être trouvé dans le fichier xml progressbar.xml (c'est à direR.layout.progressbar
). CetteTextView
peut être obtenu une fois que le contenu a été défini (à l'aide desetContentView()
). Dans votre code vous le mettre en avant cet appel est l'été et le code de mussharapp, il est de l'appeler au début. À savoir, il l'appelle après lasetContentView(R.layout.accountsummary)
appel qui ne contient pas lesTextView
. Par conséquent, la variabletxtView
sera NULLE et vous obtiendrez unNullPointerException
.Ce que vous devez faire est la suivante:
onPreExecute
, aprèssetContentView
est appelé.Pour le code regarder vers le bas ci-dessous:
OriginalL'auteur dennisg
Oui, parce que vous tentez de définir le TextView à l'intérieur de la doInBackground() la méthode, et ce n'est pas permis
Pourquoi pas? Car Il y a un seul Thread en cours d'exécution qui est de l'UI Thread Principal, et il n'est pas autorisé à mettre à jour l'INTERFACE utilisateur à partir de processus de thread. lire plus d'infos ici: Indolore Threading
Alors il existe une solution si vous souhaitez définir le TextView à l'intérieur de la doInBackground() la méthode, de faire l'INTERFACE utilisateur mise à jour des opérations à l'intérieur de la runOnUiThread méthode.
Sinon, suggestion est de faire toute l'INTERFACE utilisateur affichage/mise à jour des opérations liées à l'intérieur de la onPostExecute() la méthode la place de doInBackground() de votre classe AsyncTask.
OriginalL'auteur Paresh Mayani
ne doit être exécutée après la commande setContentView().
Aussi, vous pouvez uniquement modifier les éléments de l'INTERFACE utilisateur dans l'INTERFACE principale de thread. doInBackground() n'est pas dans le main thread d'INTERFACE utilisateur. Faire des changements de l'INTERFACE dans onPostExecute
OriginalL'auteur Mark Pazon
Les explications sont correctes: Vous n'êtes pas à faire des changements de l'INTERFACE dans n'importe quel thread, sauf le fil qui créer l'INTERFACE utilisateur. Mais AsyncTask a une méthode appelée
qui doit toujours s'exécuter dans le Thread de l'INTERFACE utilisateur. En se basant sur les modifications apportées par dennisg votre code devrait ressembler à ceci:
Noter que le type du paramètre de onProgressUpdate est le deuxième type de donnée dans AsyncTask!
Supplémentaire: Pour rendre votre code plus robuste, vous devez vérifier si la boîte de dialogue de progression existe encore avant d'établir le texte.
OriginalL'auteur ToBe_HH