2016-01-25 18 views
7

Ho una domanda da principiante su Classe/Attività/Attività. Vengo da C quindi non so se è un buon approccio per fare ciò di cui ho bisogno.Come passare valori da una classe all'attività - Android

Ho creato una classe:

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 la mia attività ho:

@Override 
public void onResume() { 
    super.onResume(); 

    mUDPServer = new UDPServer(); 
    mUDPServer.start(); 
} 

@Override 
public void onPause() { 
    super.onPause(); 

    mUDPServer.kill(); 
} 

Ora, ogni volta che ho ricevuto un pacchetto voglio che questa discussione/classe password forniti pacchetto a un metodo di attività che elabora (esegui qualche calcolo o aggiorna alcune interfacce utente ecc.) questi dati in arrivo. Ma non riesco a capire come farlo, forse il mio approccio non è corretto. Posso inserire il codice del thread all'interno di Activity ma sembra che il codice sia meno leggibile.

Suggerimento come si fa?

@Anshul Jain CODICE UPDATE:

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); 
      } 
     }); 
    } 

} 

file 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> 

risposta

4

È possibile utilizzare la richiamata per questo scopo.

definire alcune interfaccia come

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

Ora lasciate che la vostra attività implementare questa interfaccia.

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); 
    } 
}); 
} 
} 

Ora in UDPServer.java, scrivere il codice seguente

public class UDPServer { 

private MyCustomInterface interface; 

UDPServer(MyCustomInterface interface){ 
this.interface = interface; 
} 

} 

Ora ogni volta che avete alcuni dati a disposizione consente di dire una stringa, è possibile inviare in questo modo

interface.sendData(str); 
+1

I' Ho provato il tuo codice e corretto questo: "public class MyCustomInterface() {" to "public inter faccia MyCustomInterface() {"e questa" interfaccia privata MyCustomInterface; " a "private MyCustomInterface otherNameInterface;" perché Android IDE ha preso il nome dell'interfaccia come definizione. – Singee

+0

L'utilizzo di callback ha risolto il problema? – thedarkpassenger

+0

Ancora no, ho eseguito il debug e posso ricevere correttamente il pacchetto e trasferirlo in Activity. Ma quando eseguo un esempio "recived_message.setText (str);" non aggiorna il mio ViewText. Ho anche provato con runOnUiThread (new Runnable() { @Override public void run() { recived_message.setText (str); } }); ma nulla – Singee

0

forse si potrebbe utilizzare un gestore, caricarlo con alcuni dati, e quindi leggere tali dati dalla vostra attività. Check more infos here sui gestori

Basta passare un gestore dall'attività alla classe, utilizzare handler.sendMessage ("") all'interno del metodo di esecuzione e analizzare ciò che si riceve all'interno della propria attività.

1

in Android 4 opzione per fare questo

  • in Android è possibile inviare i dati tramite dolo o intenti seguita da Bundle.Like Intent i = new Intent(current_class.this, linked_class.class); i.putextra("Key", value);

E ottenere il valore (valore stringa suppongo) in un'altra classe come:

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

    class A {

    String public static _utfValue = "";

    void sendValue() { _utfValue = "un valore"; }}

a prendere questo valore nella classe Java come:

String value = A._utfValue ; 
  • È possibile utilizzare SharedPreference per salvare il valore e ottenere da altra classe.
  • È possibile utilizzare un metodo statico con un valore restituito e recuperare il metodo nella classe java tramite il nome classe.
0

Nel tuo caso, utilizzerei l'attività come interfaccia.L'interfaccia è memorizzata come parametro statico all'interno della classe Application.

0

lì Sono molti i modi in cui è possibile ottenere ciò che segue sono alcuni

  1. è possibile utilizzare le interfacce come spiegato in una delle risposte
  2. è possibile creare un IntentServce al posto della classe e utilizzare Result Receiver per comunicare i dati.
  3. è possibile utilizzare i gestori e messaggi, nonché
  4. si può anche creare un servizio e utilizzare IBinders (servizio Bound)

si può google di più su questi metodi e ha scelto quello che si adatta meglio

0

Hai un'attività A e B una, quando finisci le azioni sul lato attività B ne hai bisogno per effettuare un lato A quando torni.

  1. Creare un Instance classe e un metodo che digitare u u bisogno, consente di dire;

    interfaccia pubblica SelectedBirthday {

    vuoto onSelectedData (data String);

}

  1. Ora siamo sulla B lato, Crea e l'istanza della vostra interfaccia di classe

    privato SelectedBirthday mCallback;

  2. Override

    @Override public void onAttach (attività Attività) { super.onAttach (attività);

    try { 
         mCallback = (SelectedBirthday) activity; 
        } catch (ClassCastException e) { 
         Log.d("MyDialog", "Activity doesn't implement the ISelectedData interface"); 
        } 
    } 
    
  3. Ora caricare il valore avevi bisogno

    String userBirth = (giorno + "" + mese + "" + l'anno);

    mChiusura.onSelectedData (userBirth);

  4. Ok lascia andare a lato A

implementare la nostra classe di interfaccia

implements SelectedBirthday 

si verrà avvertiti per il suo metodo e si implementato

 @Override 
     public void onSelectedData(String date) { 
      if (!date.equals("")) { 
       txt_poup_age.setText(date); 
//now you are free to do what you want with the value you received automaticaly 
      } 
     } 
Problemi correlati