Cómo pasar valores de una clase a la actividad – Android

Tengo una pregunta de novato sobre Clase / Tarea / Actividad. Vengo de C, así que no sé si es una buena aproximación para hacer lo que necesito.

He creado una clase:

public class UDPServer { private MyDatagramReceiver myDatagramReceiver = null; private static int MAX_UDP_DATAGRAM_LEN = 1024; private static int UDP_SERVER_PORT = 5000; public void start() { myDatagramReceiver = new MyDatagramReceiver(); myDatagramReceiver.start(); } public void kill() { myDatagramReceiver.kill(); } private class MyDatagramReceiver extends Thread { private boolean bKeepRunning = true; private String lastMessage = ""; public void run() { String message; byte[] lmessage = new byte[MAX_UDP_DATAGRAM_LEN]; DatagramPacket packet = new DatagramPacket(lmessage, lmessage.length); DatagramSocket socket = null; try { socket = new DatagramSocket(UDP_SERVER_PORT); while(bKeepRunning) { socket.receive(packet); message = new String(lmessage, 0, packet.getLength()); lastMessage = message; //Here should call activity method }); } } catch (Throwable e) { e.printStackTrace(); } finally { if (socket != null) { socket.close(); } } } public void kill() { bKeepRunning = false; } } } 

Dentro de mi actividad tengo:

 @Override public void onResume() { super.onResume(); mUDPServer = new UDPServer(); mUDPServer.start(); } @Override public void onPause() { super.onPause(); mUDPServer.kill(); } 

Ahora, cada vez que recive un paquete quiero que este hilo / clase pasar recived paquete a un método de actividad que elaborar (hacer algún cálculo o actualizar algunos UI ecc ..) estos datos entrantes. Pero no puedo entender cómo hacerlo, tal vez mi enfoque no es correcto. Puedo colocar el código del hilo dentro de la actividad pero parece hacer el código menos legible.

Sugerencia de cómo hacer esto?

@Anshul Jain ACTUALIZACIÓN DEL CÓDIGO:

 public class Main_activity extends Activity implements Interface_UDPServer{ TextView recived_message; UDPServer mUDPServer; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); recived_message = (TextView)findViewById(R.id.recived_message); } @Override public void onResume() { super.onResume(); mUDPServer = new UDPServer(this); mUDPServer.start(); } @Override public void onPause() { super.onPause(); mUDPServer.kill(); } public void sendData(final String str){ runOnUiThread(new Runnable() { @Override public void run() { recived_message.setText(str); } }); } 

}

Archivo XML

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_below="@+id/linearLayout" android:layout_alignLeft="@+id/linearLayout" android:layout_alignStart="@+id/linearLayout"> <TextView android:id="@+id/recived_message" android:layout_width="200dp" android:layout_height="35dp" android:textColor="#444444" android:textSize="20dp" /> </LinearLayout> </RelativeLayout> 

Puede utilizar la devolución de llamada para este propósito.

Definir alguna interfaz como

 public class MyCustomInterface(){ public void sendData(String str); } 

Ahora deja que tu actividad implemente esta interfaz.

 public class MyActivity implements MyCustomInterface { @Override public void sendData(String str){ Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { recived_message.setText(str); } }); } } 

Ahora en UDPServer.java, escriba el siguiente código

 public class UDPServer { private MyCustomInterface interface; UDPServer(MyCustomInterface interface){ this.interface = interface; } } 

Ahora, cada vez que tenga algunos datos disponibles, digamos una cadena, puede enviarla así

 interface.sendData(str); 

En android 4 opción para hacer esto

  • En android puede enviar datos a través de Intent o Intent seguido de Bundle.Like Intent i = new Intent(current_class.this, linked_class.class); i.putextra("Key", value); Intent i = new Intent(current_class.this, linked_class.class); i.putextra("Key", value);

Y obtener el valor (suponga valor de cadena) en otra clase como:

  String value = getIntent.getExtra("String key which you used when send value"); 
  • opcion 2

    clase a{

    Public static String _utfValue = "";

    Void sendValue () {_utfValue = "algún valor"; }}

Y busque este valor en su clase java como:

 String value = A._utfValue ; 
  • Puede utilizar SharedPreference para guardar el valor y obtenerlo de otra clase.
  • Puede utilizar un método estático con algún valor de retorno y buscar el método en la clase java a través del nombre de la clase.

Tal vez usted podría utilizar un controlador, cargar con algunos datos, y luego leer los datos de su actividad. Compruebe más información aquí sobre los manipuladores

Acaba de pasar un controlador de su actividad a su clase, use handler.sendMessage ("") dentro de su método de ejecución y analizar lo que recibe dentro de su actividad.

En su caso utilizaría la actividad como interfaz. La interfaz se almacena como un parámetro estático dentro de la clase Application.

Hay muchas maneras de lograr esto a continuación son algunos

  1. Puede utilizar interfaces como se explica en una de las respuestas
  2. Puede crear un IntentServce en lugar de su clase y utilizar Resultado Receiver para comunicar los datos.
  3. También puede utilizar controladores y mensajes
  4. También puede crear un servicio y utilizar IBinders (Bound Service)

Puede obtener más información sobre estos métodos y elegir lo que mejor le convenga

  • Cómo burlar un objeto inyectado que no se declara en el módulo?
  • Comprobación para ver si existe un ID en los recursos (R.id.algo)
  • Rendimiento de procesamiento de datos recursivo utilizando Java y SQLite
  • Pasar una lista en como varargs
  • Cómo establecer mediante programación un bloqueo o un pin para una aplicación
  • Obtención de la entrada del usuario desde un cuadro de diálogo utilizando Mortar + Flow
  • Comparación de números de teléfono en Android
  • Cómo utilizar Java 8 Stream API bajo Android 6.0
  • Android.content.res.Resources $ NotFoundException
  • ¿La imagen tarda demasiado en cargarse?
  • Error de generación al usar clase interna estática
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.