2016-07-14 6 views
0

Ich bin kein Experte in Android, so tut mir leid, wenn mein Problem scheint einfach. Ich habe die ganze letzte Nacht nachgeschlagen und konnte keine Lösung finden.onOptionsItemSelected nicht die aktualisierten Variablen

Grundsätzlich, wenn ich eine Taste, die ich im Menü habe, drücken, wird die onOptionsItemSelected-Methode aufgerufen, um einen Socket mit einem Server zu erstellen. Die IP und der Port, die zum Erstellen benötigt werden, haben jedoch die Anfangswerte (Null und Null).

Aus diesem Grund habe ich versucht SharedPreferences mit dem remotePort wie dem folgenden Code speichern:

public class PlayActivity 
{ 
    private static final String TAG = "PlayActivity"; 
    private SocketClient thread; 
    private WebsocketPortClient websocketClient; 
    private static String remoteIP; 
    private static int remotePort; 
    ... 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.play_main); 

     //request port 
     context = this; 
     websocketClient = new WebsocketPortClient(event.getID(), event.getTitle(), app.getMyCode()); 
     initWebsocketClient(); 
     ... 
    } 

    public boolean onOptionsItemSelected(MenuItem item) 
    { 
     switch (item.getItemId()) { 
      case R.id.userComment: 
       ... 
       break; 
      case R.id.userCamera: // Camera Button 
       if (flPreview.getVisibility() == View.VISIBLE) { 
        ... 
       } else { 
        // Here I Get the IP and Port 
        SharedPreferences sharedPref = getSharedPreferences(getString(R.string 
          .preference_file_key), 
          Context.MODE_PRIVATE); 

        remoteIP = sharedPref.getString(getString(R.string.ip), "192.168.1.160"); 
        remotePort = sharedPref.getInt(getString(R.string.port), 8880); 

        Log.e(TAG, "Connecting to the server: " + remoteIP + " on port: " + remotePort); 
        if (started) { 
         if (remoteIP == null) { 
          thread = new SocketClient(preview); 
         } else { 
          thread = new SocketClient(preview, remoteIP, remotePort); 
         } 
         started = false; 
         flPreview.setVisibility(View.VISIBLE); 
         cameraOnBtn.setIcon(R.drawable.act_user_camera_ov); 
        } else { 
         closeSocketClient(); 
         reset(); 
        } 
       } 

       break; 
      case android.R.id.home: 
       askFinish(); 
       break; 
     } 
     return true; 
    } 

    private void initWebsocketClient() 
    { 
     assigned = new AtomicBoolean(false); 
     websocketClient.setListener(new WebsocketPortClient.WebsocketPortListener() 
     { 
      @Override 
      public void onPortAssigned(int port) 
      { 
       if (portRequester.isPortReceived()) { 
        SharedPreferences sharedPref = getSharedPreferences(getString(R.string 
          .preference_file_key), 
          Context.MODE_PRIVATE); 
        SharedPreferences.Editor editor = sharedPref.edit(); 
        editor.clear(); 
        editor.putInt(getString(R.string.port), portRequester.getAssignedPort()); 
        editor.commit(); 

        Log.e(TAG, "onPortAssigned: " + sharedPref.getInt(getString(R.string.port), 
          8880)); 

        supportInvalidateOptionsMenu(); 
        assigned.set(true); 
       } 
      } 
     }); 
    } 
    ... 
} 

Auch habe ich versucht, mit AtomicInteger für die remotePort aber es hat die gleichen Ergebnisse. Der Wert ist immer Null. Jetzt mit SharedPreferences der Wert Ich habe die vorherigen gespeicherten Wert, wie Sie in diesem Protokoll sehen:

E/socketPort: connect(): ws://portassigner.net:8080/ControllerServer/actions 
E/socketPort: jsonObj sent: {"action":"add","eventID":"542398d26b980","eventTitle":"테트","userID":"6da557b7d92"} 
E/socketPort: jsonObj received: {"action":"add","id":0,"eventID":"542398d26b980","eventTitle":"테트","userID":"6da557b7d92","status":"Off","color":"color02","assignedPort":8680} 
E/socketPort: Action: add 
E/socketPort: Add Port: 8680 
E/tya: Running: 4, Top: ComponentInfo{kseek.stime/kseek.stime.event.play.PlayActivity} 
E/MediaPlayer: Should have subtitle controller already set 
E/tya: EventLoadingActivity::Finish() 
E/tya: GC_RECV << SC;I;542398d26b980:110:1/0/1/20000; : 
E/PlayActivity: Connecting to the server: 192.168.1.160 on port: 8330 
E/socket: java.net.ConnectException: failed to connect to /192.168.1.160 (port 8330) after 10000ms: isConnected failed: ECONNREFUSED (Connection refused) 

Ich möchte wirklich wissen, wie die remotePort Wert innerhalb des onOptionsItemSelected zu aktualisieren. Der Port wird mithilfe eines Listeners aktualisiert, der beim Erstellen der Aktivität erstellt wird. Danke Jungs für Ihre Hilfe im Voraus.

+0

Haben Sie jemals den remotePort oder remoteIP eingestellt? Ich sehe, du liest es, schreibst es aber nie. Es wird den Standardwert haben, wenn Sie es nie an irgendwas setzen. – TheAnonymous010

+0

zuerst ich sie in der 'onCreate()', wenn die Aktivität erstellt wird, dann, weil ich den Port muss ich einen Listener erstellen aktualisieren. Mein Protokoll zeigt, dass der Port aktualisiert und in 'sharedPref' gespeichert wurde. Aber wenn ich versuche, es zu lesen, habe ich eine andere Portnummer bekommen, wahrscheinlich von der kostbaren Ausführung. [Dies ist das Protokoll] (http://i.imgur.com/kHWo3bD.png) <- – Teocci

+1

Sind Sie sicher, dass Sie 'apply()' oder 'commit()' aufrufen, nachdem Sie die SharedPreferences aktualisiert haben? – TheAnonymous010

Antwort

0

Was sollten Sie tun?

Legen Sie den Wert von remoteIP in Ihren gemeinsamen Einstellungen fest, nachdem Sie den Wert kennen. Sie haben den Wert nicht irgendwo im Code festgelegt. Aber Sie lesen es

Warum?

Sie haben nicht den Wert von

remoteip überall im Code festgelegt.

Deshalb

remoteip = sharedPref.getString (getString (R.string.ip), "192.168.1.160");

hat keine IP.

Sie erhalten Ihre Standard-Port-Wert, weil

if (remoteip == null) ist immer wahr.

+0

wenn Sie initWebsocketClient den Wert remoteIP ist nicht das Problem remotePort ist mein Problem ..Ich muss den Port die ganze Zeit aktualisieren. – Teocci

+0

Dann würde ich vorschlagen, dass Sie die Port-und IP-Variablen innerhalb der Aktivität in einem globalen Kontext zu halten. Lesen und schreiben in gemeinsamen Einstellungen scheint Zeit zu verbrauchen und ist in Ihrem Fall auch nicht notwendig. –

+0

Wie Sie sehen können, sind die Variablen global und nicht nur das mache ich dann statische 'private statische String remoteIP; private static int remotePort; '. Ich versuche auch mit 'AtomicInteger' – Teocci

Verwandte Themen