2016-07-14 26 views
0

私はAndroidの専門家ではありません。私は最後の夜にそれを探して過ごして、解決策を見つけることができませんでした。onOptionsItemSelectedは更新された変数を取得しません

基本的には、メニューにあるボタンを押すと、onOptionsItemSelectedメソッドが呼び出され、サーバーでソケットが作成されます。ただし、作成に必要なIPとポートには、初期値(NULLとゼロ)があります。そのため

は、私は次のコードとして remotePortを保存するために SharedPreferencesを使用してみました:

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

はまた、私はremotePortためAtomicIntegerと試みたが、それは同じ結果を持っています。値は常にゼロです。今、あなたは、このログに見ることができるように私が得た値は、前回保存された値であるSharedPreferencesを使用して:

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) 

私は本当にonOptionsItemSelectedの内側remotePort値を更新する方法を知りたいです。ポートは、アクティビティの作成時に作成されるリスナを使用して更新されます。 おかげであなたの助けになる前に。

+0

remotePortまたはremoteIPを設定しましたか?私はあなたがそれを読んでいるが、決してそれに書いているのを見ている。最初に何も設定しないと、デフォルト値になります。 – TheAnonymous010

+0

まず、アクティビティの作成時に 'onCreate()'に設定します。なぜなら、リスナを作成するポートを更新する必要があるからです。 私のログは、ポートが更新され、 'sharedPref'に保存されていることを示しています。しかし、私がそれを読んでみると、おそらく貴重な実行から別のポート番号が得られます。 [これはログです](http://i.imgur.com/kHWo3bD.png)< - – Teocci

+1

SharedPreferencesを更新したら、 'apply()'または 'commit()'を呼び出していますか? – TheAnonymous010

答えて

0

どうすればよいですか?

値を知っている場合は、共有プリファレンスのremoteIPの値を設定してください。コードのどこにでもその値を設定していません。しかし、あなたはそれを読む

なぜですか?

あなたはどこにでもコードで

remoteIPの値を設定していません。

理由

remoteIP = sharedPref.getString(のgetString(R.string.ip)、 "192.168.1.160")です。

にはあなたのIPアドレスがありません。

(remoteIP == null)の場合は、常に真であるので、あなたは、あなたのデフォルトのポート値を取得します。

+0

initWebsocketClientの値が設定されていれば、remoteIPは問題ではありませんremotePortは私の問題です。私は常にポートを更新する必要があります。 – Teocci

+0

次に、グローバルコンテキストでポートとIP変数をアクティビティ内に保存することをお勧めします。共有の設定での読み書きは、時間がかかるようで、あなたの場合は不要です。 –

+0

あなたが見ることができるように、変数はグローバルであり、静的な 'private static String remoteIP;プライベート静的intリモートポート; '。私も 'AtomicInteger'で試してみましょう – Teocci

関連する問題