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:
- JSoup 1.6.0 en Android lanza Excepción: String.isEmpty () NoSuchMethodExists
- Android LoaderManager y CursorLoader Confusión
- Lista de la documentación de Android Ver ejemplo Código fuente en XML
- El parámetro de declaración de una función como final: ¿por qué y cuándo es necesario?
- Android: cambiar el campo final estático privado usando la reflexión de java
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>
- Analizando la respuesta ksoap2
- ¿Cuál es el propósito de ClassName.this más allá de la desambiguación?
- No se puede cambiar completamente el esquema de color del tema de Eclipse ADT
- Java / Android: convierte una cadena de hora GMT a hora local
- las mejores prácticas para acceder a datos en una base de datos mientras
- Cómo obtener el nombre del paquete del archivo de clase de origen en Android?
- BroadcastReceiver para ACTION_MEDIA_BUTTON no funciona
- ¿Cómo validar el formato y los valores de EditTextPreference introducidos en Android 2.1?
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
- Puede utilizar interfaces como se explica en una de las respuestas
- Puede crear un IntentServce en lugar de su clase y utilizar Resultado Receiver para comunicar los datos.
- También puede utilizar controladores y mensajes
- 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