Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: Cómo utilizar un Handler handleMessage y acceder a la referencia a MainActivity

Tengo un servicio que recibe un comando de Internet y lanza un hilo de fondo. Este hilo se pasa un controlador desde el servicio (el servicio está limitado y pasado el controlador) y envía un mensaje al manejador para tomar una imagen. Estoy atascado en la implementación del manejador.

static Handler handler = new Handler() { @Override public void handleMessage(Message msg) { //TODO: Handle different types of messages mCamera.takePicture(null, null, MainActivity.this); } }; 

Preguntas:

  • ¿Es necesario que el manejador sea estático? Sin la estática, consigo "esta clase del manejador debe ser estática o los escapes pueden ocurrir"
  • ¿Necesita mCamera ser estática? Me han dicho que mCamera sea estático, pero ¿por qué es necesario? ¿Hay una manera de configurar takePicture sin hacer mCamera estática?
  • ¿Cuál es la forma correcta de pasar la referencia a MainActivity? Ahora mismo obtengo el error: "No se puede acceder a una instancia de inclusión del tipo MainActivity en el ámbito"

  • ¿Por qué son los mensajes emergentes de Android llamados brindis?
  • Android: error al cargar la biblioteca
  • Android / FBReaderJ / gen ya existe pero no es una carpeta de origen. Convertir a una carpeta de origen o renombrarla
  • SQLite dispara en Android?
  • Error de enlace no satisfactorio al inicializar el concentrador Myo en Android
  • ¿Existe ya una clase StopWatch para android y por qué no funciona mi implementación?
  • Actualizaciones de subprocesos no disponibles para el cliente seleccionado
  • Obtenga el contexto de aplicación de la clase singleton de no actividad
  • 4 Solutions collect form web for “Android: Cómo utilizar un Handler handleMessage y acceder a la referencia a MainActivity”

    Puede hacer una clase (Actividad / Servicio) implementar Handler.Callback y crear un nuevo Handler para ello a través del new Handler(this) .

    Puede cambiar su código de la siguiente manera:

      static Handler handler = new Handler() { MainActivity mActivity; @Override public void handleMessage(Message msg) { //TODO: Handle different types of messages if(mActivity != null) { mActivity.mCamera.takePicture(null, null, mActivity); } } }; void MainActivity::onCreate(Bundle savedState) { ... handler.mActivity = this; } void MainActivity::onDestroy() { ... handler.mActivity = null; } 

    He aquí una buena explicación de por qué el manejador debe ser estático:

    Esta clase de controlador debe ser estática o pueden producirse fugas: IncomingHandler

    Sobre su otra pregunta, si usted hace que el manejador estético usted debe también hacer todos los campos que usted utiliza dentro de él estático.

    Puede utilizar Message member obj y pasar el objeto deseado al manejador.

     static Handler handler = new Handler() { @Override public void handleMessage(Message msg) { //TODO: Handle different types of messages //TODO: handle cast exception final MainActivity activity = (MainActivity) msg.obj; final Camera camera = activity.getCamera(); camera.takePicture(null, null, activity); } }; 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.