2016-03-08 2 views
0

Я работаю на небольшой код, который использует сокет связи на Java, и я пытаюсь сделать следующее:переменная доступа из другого потока в Java

  1. Получить объект JSON и разобрать его [Готово]
  2. Если команда получила была login затем начать вход [Готово]
  3. печати к гнезду в результате процедуры авторизации это последняя часть У меня возникли проблемы с, мой код выглядит следующим образом:

    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?

+0

Вы можете попробовать сделать свой 'out' переменного финала? вы должны перенести этот 'out.println (mensagem);' inside 'recebeuResposta'. –

+0

Вы можете сделать 'out' переменной класса. –

+0

Если я сделаю это окончательным, я все равно смогу сделать «out = new PrintWriter (client.getOutputStream(), true)», если сообщение опустилось (получив нуль)? –

ответ

1

Объявить PrintWriter out как глобальные переменные в деятельности/фрагменте

+0

Это сработало красиво, благодаря кучу @Xoce! –

+0

Добро пожаловать @BernardMeurer –

Смежные вопросы