vistas studio que propiedades programacion example definicion clase atributos android handler android-asynctask

android - studio - CalledFromWrongThreadException: solo el subproceso original que creó una jerarquía de vista puede tocar vistas



viewgroup android example (5)

Ampliando la respuesta de willcodejavaforfood para mayor claridad e implementación ...

Lo hice funcionar y a continuación es cómo lo hice. Estoy ejecutando múltiples subprocesos de procesamiento en un servicio para que otras soluciones que se ejecutan en la actividad no funcionen, como runOnUiThread (nuevo Runnable () {} ...

Coloque esto en la parte superior de su clase de servicio para que esté accesible en todas partes en esta clase:

Handler handler;

Pon esto en tu clase de servicio en el método Crea o algo que se carga en el hilo principal del servicio

handler= new Handler(Looper.getMainLooper());

Ponga esto dentro de su hilo adicional para ''publicar'' el código para que se ejecute en UI o en la IU de servicio (de lo que se llame):

handler.post(new Runnable() { public void run() { playNext(); //or whatever method you want to call thats currently not working } });

Tengo un problema con el siguiente error en Android:

CalledFromWrongThreadException ;: Solo el hilo original que creó una jerarquía de vista puede tocar sus vistas

Parece que sucede cuando trato de actualizar una vista de texto en mi actividad, la llamada para actualizar el TextView es desde mi actividad, pero sigo recibiendo el error anterior.

Lo tengo así:

onCreate (): establece los botones y la vista de texto.

onStateChange () - un detector para notificaciones sobre cambios de estado, cuando recibe una notificación si cambia el TextView para decir un texto diferente.

Cuando recibo una notificación de un nuevo texto, trato de cambiar el TextView así:

((TextView)findViewById(R.id.title)).setText("Some Text");

Pero obtengo el error anterior.

Al buscar en Google, parece que debería usar un controlador para cambiar el TextView o tal vez usar AsyncTask.

¿Alguien podría explicar cuál sería mejor usar y por qué?

EDITAR: SNIPPETS DE CÓDIGO AGREGADO:

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.my); getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.my_title); ((TextView)findViewById(R.id.time)).setText("Hello Text"); findViewById(R.id.keyboardimage).setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:")); startActivity(dialIntent); dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.FLAG_SOFT_KEYBOARD)); dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK)); } }); }

//CallBacks from running Service private final ICallDialogActivity.Stub iCallDialogActivity = new ICallDialogActivity.Stub(){ @Override public void onStateChanged(int callState) throws RemoteException { switch(callState){ case GlobalData.CALL_STATUS_IDLE: break; case GlobalData.CALL_STATUS_DISCONNECTING: byeSetup(); break; } };

public void byeSetup(){ ((TextView)findViewById(R.id.time)).setText("Bye Text"); findViewById(R.id.keyboardimage).setOnClickListener(new OnClickListener() { public void onClick(View v) { //Void the Button }}); }


Este método es solo para Actividades y es mejor cuando el cambio involucra al hilo principal ( UiThread ). Úselo dentro de otro hilo para cambiar cualquier vista.

runOnUiThread(new Runnable() { @Override public void run() { // TODO your Code et_Pass.setText(""); } });


Otro enfoque, esta vez haciendo uso de android.os.Message

Haz que android.os.Handler defina como un campo dentro de tu actividad:

private final Handler myTextHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message stringMessage) { textView.append((String) stringMessage.obj); return true; } });

Luego alimentarlo de su otro hilo de esta manera:

Message stringMessage = Message.obtain(myTextHandler); stringMessage.obj = "Hello!"; stringMessage.sendToTarget();


Para otros, simplemente reemplace byeSetup (); con sus declaraciones de código o métodos. byeSetup () es un método de muestra. Espero que ahorrará algo de tu tiempo.


Parece que estás en el hilo equivocado. Intente usar un controlador para actualizar la GUI en el hilo correcto. Consulte Manejo de operaciones caras en la interfaz de usuario. Ejemplo de hilo de android.com. Básicamente, incluiría byeSetup en Runnable e invocarlo con una instancia de Handler .

Handler refresh = new Handler(Looper.getMainLooper()); refresh.post(new Runnable() { public void run() { byeSetup(); } });