Tengo un método updateFoo() de una actividad llamada tanto desde un subproceso de Manejador cada 5 segundos como desde un botón cuando el usuario desea presionarlo ... actualizarDe manera actualizo la interfaz de mi actividad. .. para que este método sea seguro, lo declare "sincronizado" ... ¿Es así?Hacer que un método de actividad android sea seguro
Respuesta
bien utilizando un Handler:.. http://developer.android.com/reference/android/os/Handler.html es seguro para hilos. Puede consultar un tutorial aquí: http://mindtherobot.com/blog/159/android-guts-intro-to-loopers-and-handlers/ puede hacer cálculos largos en subprocesos y las actualizaciones de la interfaz de usuario desde la cadena Handler (creada en el hilo principal) desde su hilo de trabajo.
Marcado un método synchronized
es una manera para que sea seguro ante los threads - básicamente lo hace de manera que sólo un hilo puede estar en el método en un momento dado.
Sin embargo, eso podría no ser la opción mejor porque si updateFoo()
hace algunas operaciones de larga ejecución, el hilo de interfaz de usuario podría colgar (es decir. La prensa botón puede quedar atrapado esperando para entrar en [y ejecutar] updateFoo()
.
un método más granular sería utilizar cerraduras, o algunas de las otras opciones de encadenamiento de Java Si publica el código a su método, que nos gustaría poder encontrar una solución mejor
Si usa la concurrencia de paso de mensajes, no debería preocuparse demasiado por los conflictos de concurrencia. Para hacer esto, pasaría un objeto inmutable para iniciar el hilo, el hilo no leería ni escribiría en ninguna memoria compartida fuera del hilo, y el hilo devolvería un objeto inmutable.
Si utiliza la comunicación de memoria compartida, en mi humilde opinión, simplemente declarar su método sincronizado puede o no ser suficiente para ser seguro para subprocesos. Si el método IN TURN accede a la memoria compartida que no es segura para subprocesos, atómica, etc., podría haber conflictos de concurrencia.
Gracias a todos por las respuestas :) Probé este código, más simple que el proyecto que estoy edificio:
package provadroid.prova;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class AndroidSynch extends Activity {
private TextView text_to_view;
private Button change_text;
private static final Handler handler = new Handler();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.change_text = (Button)this.findViewById(R.id.change_button);
this.text_to_view = (TextView)this.findViewById(R.id.text_to_view);
this.change_text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
AndroidSynch.this.updateText(" Button ");
}
});
doTheAutoRefresh(5000);
}
synchronized void updateText(String str)
{
this.text_to_view.setText(this.text_to_view.getText() + str);
}
void doTheAutoRefresh(long time) {
handler.removeMessages(0);
handler.postDelayed(new Runnable() {
@Override
public void run() {
AndroidSynch.this.updateText(" Handler ");
AndroidSynch.this.doTheAutoRefresh(5000);
}
}, time);
}
}
Un manejador de fondo ejecuta en segundo plano cada 5 segundos, después de que la actualización de la TextView .. El botón actualiza la vista de texto también ...
Todo parece funcionar bien tanto con sincronización en la función update_text como sin ella ... Supongo que eso sucede porque update_text funciona en la UI para que el manejador tenga acceso exclusivo y espere si alguien está llamando a update_text..Pero si la función no funciona en la interfaz de usuario y es invocada por el controlador y por un botón u otro controlador, debería declararlo sincronizado, ¿verdad?
- 1. ¿La forma más simple de hacer que todo un método sea seguro para subprocesos?
- 2. ¿Es posible hacer que Oauth sea seguro en iOS?
- 3. Cómo hacer que mi código sea más seguro
- 4. Cómo hacer que boost asio fork sea seguro
- 5. Cómo hacer que Java.util.Date sea seguro para subprocesos
- 6. ¿Este código es seguro para subprocesos? ¿Cómo puedo hacer que sea seguro para subprocesos?
- 7. ¿Cómo hacer que un objeto sea accesible para todas las actividades en un programa de Android?
- 8. C#: ¿Cómo puedo hacer que un subproceso IEnumerable <T> sea seguro?
- 9. ¿Es necesario que un método organizado en el subproceso de UI sea seguro para subprocesos?
- 10. ¿Por qué deberíamos hacer que un hilo ManageSBean de SessionScoped sea seguro en JSF?
- 11. ¿Cómo puedo hacer que un fallo predeterminado sea seguro para los clientes no habituales?
- 12. ¿Puedo hacer que un TTreeNode sea invisible?
- 13. Android: ¿usa el método de un servicio en una actividad?
- 14. Cómo hacer que TimePicker sea más pequeño
- 15. Hacer un servicio web seguro
- 16. Android Spinner: cómo hacer que la vista desplegable sea transparente?
- 17. Android: Hacer que un botón sea visible una vez que la vista web se haya realizado al desplazarse
- 18. ¿Puedo hacer que un elemento ListView no sea seleccionable?
- 19. Android: Personalizar las pestañas en el estado: ¿Cómo puedo hacer que un selector sea un dibujable
- 20. ¿Puede hacer que el tiempo de compilación del cableado de Asp.net MVC View sea seguro?
- 21. ¿Cómo puedo hacer que mi subproceso de sistema de entidad componente sea seguro?
- 22. Cómo hacer que mi código sea rápido
- 23. Cómo hacer que la GUI de Linux sea "utilizable" cuando hay mucha actividad de disco
- 24. Opciones para hacer que el hilo ByteBuffer de Java sea seguro
- 25. función de parámetro variable, cómo hacer que el tipo sea seguro y más significativo?
- 26. cómo hacer que la barra de desplazamiento gridview sea siempre visible en android 4.0.3
- 27. C# - Cómo hacer que un método solo sea visible para las clases que heredan la clase base del método
- 28. ¿Cuáles son los peligros de hacer que un método sea virtual?
- 29. anotación para hacer que un método privado sea público solo para las clases de prueba
- 30. Definir un método que sea un cierre en Ruby