2016-07-14 2 views
0

Android에서 전문가가 아니므로 문제가 근본적인 것 같아서 죄송합니다. 지난 밤에 그것을 보면서 나는 해결책을 찾지 못했습니다.onOptionsItemSelected가 업데이트 된 변수를 가져 오지 않았습니다.

기본적으로 메뉴에있는 버튼을 누르면 onOptionsItemSelected 메서드가 호출되어 서버가있는 소켓을 만듭니다. 그러나 IP W 포트는 초기 값 (널 (null)과 0)을 갖습니다. 이러한 이유로

, 나는 다음과 같은 코드로 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로 시도했지만 같은 결과가 있습니다. 값은 항상 0입니다. 난 정말 onOptionsItemSelected의 내부 remotePort 값을 업데이트하는 방법을 알고 싶어

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) 

:이 로그에서 볼 수 있듯이 이제, 내가 가진 값이 이전에 저장된 값입니다 SharedPreferences를 사용하여. 포트는 활동이 작성 될 때 작성되는 리스너를 사용하여 갱신됩니다. 미리 도움을 요청 해 주셔서 감사합니다.

+0

remotePort 또는 remoteIP를 설정 한 적이 있습니까? 나는 당신이 그것을 읽고 있지만 결코 그것에 쓰는 것을 보았다. 처음에 아무 것도 설정하지 않으면 기본값을 갖습니다. – TheAnonymous010

+0

먼저 Listener를 생성하는 포트를 업데이트해야하기 때문에 Activity가 생성 될 때'onCreate()'에 설정한다. 내 로그는 포트가 업데이트되어'sharedPref'에 저장되었음을 보여줍니다. 그러나 그것을 읽으려고하면 다른 포트 번호를 얻었습니다. [This is the Log] (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 remotePort;'. 나는 또한 AtomicInteger로 시도한다 – Teocci

관련 문제