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
를 사용하여. 포트는 활동이 작성 될 때 작성되는 리스너를 사용하여 갱신됩니다. 미리 도움을 요청 해 주셔서 감사합니다.
remotePort 또는 remoteIP를 설정 한 적이 있습니까? 나는 당신이 그것을 읽고 있지만 결코 그것에 쓰는 것을 보았다. 처음에 아무 것도 설정하지 않으면 기본값을 갖습니다. – TheAnonymous010
먼저 Listener를 생성하는 포트를 업데이트해야하기 때문에 Activity가 생성 될 때'onCreate()'에 설정한다. 내 로그는 포트가 업데이트되어'sharedPref'에 저장되었음을 보여줍니다. 그러나 그것을 읽으려고하면 다른 포트 번호를 얻었습니다. [This is the Log] (http://i.imgur.com/kHWo3bD.png) <- – Teocci
SharedPreferences를 업데이트 한 후에'apply()'또는'commit()'을 호출 하시겠습니까? – TheAnonymous010