Я работаю на небольшой код, который использует сокет связи на Java, и я пытаюсь сделать следующее:переменная доступа из другого потока в Java
- Получить объект JSON и разобрать его [Готово]
- Если команда получила была
login
затем начать вход [Готово] печати к гнезду в результате процедуры авторизации это последняя часть У меня возникли проблемы с, мой код выглядит следующим образом:
public class LoginActivity extends Activity { private Button btnLogin; private Button btnDemo; private EditText edtLogin; private EditText edtSenha; private ProgressDialog pd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); btnLogin = (Button)findViewById(R.id.btnLogin); btnDemo = (Button)findViewById(R.id.btnDemo); edtLogin = (EditText)findViewById(R.id.edtLogin); edtSenha = (EditText)findViewById(R.id.edtSenha); pd = new ProgressDialog(this); new Thread(new Runnable(){ public void run(){ try { String inMsg; JSONObject fromClient; String cmd; JSONArray args; ServerSocket server; Socket client; BufferedReader in; PrintWriter out; //TODO: Getting reconnects on a proper method System.out.println("Waiting for client on port 8888"); server = new ServerSocket(8888); client = server.accept(); System.out.println("Just connected to " + client.getRemoteSocketAddress()); in = new BufferedReader(new InputStreamReader(client.getInputStream())); out = new PrintWriter(client.getOutputStream(), true); while(true) { inMsg = in.readLine(); if (inMsg == null) { System.out.println("Waiting for client on port 8888"); client = server.accept(); System.out.println("Just connected to " + client.getRemoteSocketAddress()); in = new BufferedReader(new InputStreamReader(client.getInputStream())); out = new PrintWriter(client.getOutputStream(), true); continue; } fromClient = new JSONObject(inMsg); System.out.println("In: " + fromClient); cmd = fromClient.getString("command"); args = new JSONArray(fromClient.getString("args")); if(cmd.equals("login")){ final String login = args.getString(0); final String pwd = args.getString(1); AndroidUtil.mostrarProgressoAguarde(LoginActivity.this, pd); new Thread(new Runnable() { public void run() { PagPop.getInstance().logar(LoginActivity.this, login, pwd, new ServidorListener<Cliente>() { @Override public void recebeuResposta(String mensagem, RespostaServidor<Cliente> resposta) { handleResposta(mensagem, resposta); } }); } }).start(); //out.println(mensagem); } else { out.println("Received"); } } } catch (Exception e) { e.printStackTrace(); } } }).start(); btnLogin.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { final String login = edtLogin.getText().toString(); final String senha = edtSenha.getText().toString(); System.out.print("Tentando Logar"); AndroidUtil.mostrarProgressoAguarde(LoginActivity.this, pd); new Thread(new Runnable() { public void run() { PagPop.getInstance().logar(LoginActivity.this, login, senha, new ServidorListener<Cliente>() { @Override public void recebeuResposta(String mensagem, RespostaServidor<Cliente> resposta) { handleResposta(mensagem, resposta); } }); } }).start(); } });
Около середины коды есть моя неудачная попытка распечатать нужный переменный в //out.println(mensagem);
Если я пытаюсь скомпилировать мой код, что происходит следующее:
[javac] /android/demo/LoginActivity.java:107: error: local variable out is accessed from within inner class; needs to be declared final
[javac] out.println(mensagem);
Как я могу либо транспорт, который переменная mensagem
оттуда, поэтому я могу out.println
от уровня if
или получить доступ out
от этого метода без принятия out
final?
Вы можете попробовать сделать свой 'out' переменного финала? вы должны перенести этот 'out.println (mensagem);' inside 'recebeuResposta'. –
Вы можете сделать 'out' переменной класса. –
Если я сделаю это окончательным, я все равно смогу сделать «out = new PrintWriter (client.getOutputStream(), true)», если сообщение опустилось (получив нуль)? –