私は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
値を更新する方法を知りたいです。ポートは、アクティビティの作成時に作成されるリスナを使用して更新されます。 おかげであなたの助けになる前に。
remotePortまたはremoteIPを設定しましたか?私はあなたがそれを読んでいるが、決してそれに書いているのを見ている。最初に何も設定しないと、デフォルト値になります。 – TheAnonymous010
まず、アクティビティの作成時に 'onCreate()'に設定します。なぜなら、リスナを作成するポートを更新する必要があるからです。 私のログは、ポートが更新され、 'sharedPref'に保存されていることを示しています。しかし、私がそれを読んでみると、おそらく貴重な実行から別のポート番号が得られます。 [これはログです](http://i.imgur.com/kHWo3bD.png)< - – Teocci
SharedPreferencesを更新したら、 'apply()'または 'commit()'を呼び出していますか? – TheAnonymous010