android - appeler le thread de l'interface utilisateur de thread
Salut, je veux faire Toast
disponible pour moi, personne n'-importe-quoi et disponibles à partir de n'importe quel thread à chaque fois que j'aime dans mon application. Pour ce faire, j'ai étendu le Activity
classe:
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Toast;
public class MyActivity extends Activity{
private Handler mHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
mHandler = new Handler();
super.onCreate(savedInstanceState);
}
private class ToastRunnable implements Runnable {
String mText;
public ToastRunnable(String text) {
mText = text;
}
public void run(){
Toast.makeText(getApplicationContext(), mText, Toast.LENGTH_SHORT).show();
}
}
public void doToast(String msg) {
mHandler.post(new ToastRunnable(msg));
}
}
de sorte que tous Activity
classes dans l'une de mes applications sont maintenant tout simplement
public class AppMain extends MyActivity {
//blah
}
ce que je devrait être en mesure de le faire (dans un thread de travail) est-ce que:
try{
MyActivity me = (MyActivity) Looper.getMainLooper().getThread();
me.doToast("Hello World");
}
catch (Exception ex){
Log.e("oh dear", ex.getMessage());
}
et aussi longtemps que le Activity
était un "MyActivity
" il devrait fonctionner - mais le problème, c'est ---> le Looper.getMainLooper().getThread();
n'est pas le retour de la MyActivity
pour moi et cela me faire pleurer, ce que je fais mal?
: EDIT :
un peu de contexte pour expliquer "pourquoi", je suis coincé avec ce type de mise en oeuvre.
J'ai besoin d'être en mesure de confirmer à l'utilisateur qu'une "HTTP POST" événement a été un succès. Maintenant. Si l'Utilisateur clique sur "OK" sur l'INTERFACE utilisateur du Formulaire, il PEUT ou PEUT ne PAS avoir internet à l'époque.. Si il a Internet - tout va bien - il valide le formulaire via HTTP POST bien.. mais si il y a PAS d'Internet plus (99,999% des applications Android boiteux /pathétique /plaintive à cela, et offrent à l'utilisateur plan "b" en supposant que l'internet est-il - quand il ne l'est PAS)
Mon Application ne sera pas "aller boiteux (comme je l'appelle)" - il a un plan "b" au lieu de cela il "Files d'attente" de la post-événement et de tentatives toutes les x minutes.. maintenant, c'est un silence thread en arrière-plan.. j'ai beaucoup d'interaction de l'utilisateur tous les plus de l'application je ne sais pas où l'utilisateur va "être", mais finalement, quand le HTTP POST que la file d'attente/tentatives/file/tentatives de retours "! Succès! "Je veux Toast
que comme un message à l'utilisateur (par exemple: "votre formulaire a été envoyé")
Vous devez vous connecter pour publier un commentaire.
Quel est le problème avec
runOnUiThread
?http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Praticable)
Toast
des messages à l'utilisateur,runOnUiThread
accepte unRunnable Action
quiToast
ne fonctionne pas avecactivity
car il n'est pascontext
getApplicationContext()
?worker
filMyActivity
la mise en œuvre d'écouter pour elle?utilisez code ci-dessous. créer de l'activité de l'objet qui contient votre activité instance..
worker
fil il n'y a pas deactivity
(il n'est pas praticable comme un paramètre car le travailleur est perpétuellement en train d'essayer de se connecter au serveur pour envoyer un message.. et de l'Activité des appels dans la ferme elle-même.. j'ai besoin de confirmer à partir du serveur et de reconnaître l'événement à l'utilisateur dès que ça se passe. Tout ce que je besoin est Android pour la toux jusqu'à l'actuel thread d'interface utilisateur comme une Activité.Ce qui vous permettra d'afficher le message sans avoir besoin de s'appuyer sur le contexte pour lancer le toast, seulement pour référence lors de l'affichage du message lui-même.
runOnUiThread n'a pas de travail à partir d'une Vue OpenGL fil et c'était la solution. Espérons que cela aide.
Vous ne pouvez pas jeter le résultat de
getThread()
à une instance de votreMyActivity
de la classe de base.getThread()
renvoie uneThread
qui n'a rien à voir avecActivity
.Il n'y a pas grand-lire: propre façon de faire ce que vous voulez faire. À un certain point, votre "thread" abstraction devez disposer d'une référence à quelque chose qui peut créer un
Toast
pour vous. D'économie statique variable contenant une référence à votreActivity
sous-classe, simplement pour être en mesure de raccourciToast
création est une recette pour les fuites de mémoire et de la douleur.Activity
pour inclure unHandler
.. Tout ce que je veux Android à faire est de cracher sur l'Activité en cours..getThread()
renvoie uneThread
, ce qui n'est pas unActivity
, sans parler deMyActivity
.Activity
est le visage avant de le Thread d'INTERFACE utilisateur.. je ne suis pas sûr de savoir pourquoi il n'y a pas unLooper.getMainLooper().getThread().getActivity() / .getContext()
pour être honnête.. je m'attendais à y être. la plupart des solutions exigent que vous passez le contexte comme un paramètre - mais que faire si vous ne savez pas ce contexte, il est ou si c'est une forme proche de l'événement qui a appelé le travailleur (comme dans mon cas)?Context
objet où vous en avez besoin.AsyncTask
pour effectuer vos tentatives "à l'infini" de routine et de montrer votreToast
dansonPostExecute()
. Ou unService
etBroadcastReceiver
. Un rawThread
n'est pas la meilleure solution à votre problème.Pourquoi ne pas vous envoyer une intention qui est capturé par un BroadCastReceiver, puis le récepteur de radiodiffusion peut créer une notification dans la barre de notification. Ce n'est pas un toast, mais c'est un moyen d'informer l'utilisateur que son post a été couronnée de succès.
si vous avez le contexte avec vous, vous pouvez appeler le thread d'interface utilisateur comme ceci à partir de la non activité de la classe.
Si c'est à l'intérieur de votre propre activité, pourquoi ne pouvez-vous pas simplement appeler
doToast()
?