android intentservice android-toast

android - IntentService no mostrarĂ¡ Toast



android-toast (4)

Debes iniciar el Toast en el hilo principal:

new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); } });

Esto se debe a que, de lo contrario, el subproceso del IntentService se cierra antes de que se pueda enviar el brindis, lo que genera una excepción IllegalStateException:

java.lang.IllegalStateException: Handler (android.os.Handler) {12345678} enviando un mensaje a un Handler en un hilo muerto

Este IntentService que he creado mostrará Toasts en onStartCommand () y enDestroy (), pero no en onHandleIntent (). ¿Me estoy perdiendo algo acerca de las limitaciones de un IntentService?

public class MyService extends IntentService { private static final String TAG = "MyService"; public MyService(){ super("MyService"); } @Override protected void onHandleIntent(Intent intent) { cycle(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show(); //This happens! return super.onStartCommand(intent,flags,startId); } @Override public void onCreate() { super.onCreate(); } @Override public void onDestroy() { Toast.makeText(this, "service stopping", Toast.LENGTH_SHORT).show(); //This happens! super.onDestroy(); } private void cycle(){ Toast.makeText(this, "cycle done", Toast.LENGTH_SHORT).show(); //This DOESN''T happen! Log.d(TAG,"cycle completed"); //This happens! } }


La respuesta aceptada no es correcta.

Aquí es cómo puede mostrar tostadas desde onHandleIntent() :

Crear una clase DisplayToast :

public class DisplayToast implements Runnable { private final Context mContext; String mText; public DisplayToast(Context mContext, String text){ this.mContext = mContext; mText = text; } public void run(){ Toast.makeText(mContext, mText, Toast.LENGTH_SHORT).show(); } }

Cree una instancia de un Handler en el constructor de su servicio y llame al método de post con un objeto DisplayToast dentro.

public class MyService extends IntentService { Handler mHandler; public MyService(){ super("MyService"); mHandler = new Handler(); } @Override protected void onHandleIntent(Intent intent) { mHandler.post(new DisplayToast(this, "Hello World!")); } }


Otra opción es RxJava , por ejemplo:

private void showToast(final String text) { Observable.just(text) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<String>() { @Override public void call(String s) { Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG).show(); } }); }

Advertencia : soy nuevo en Android.


Se llama a onHandleIntent () desde un subproceso en segundo plano (de eso se trata IntentService), por lo que no debería hacer UI desde allí.