gpt4 book ai didi

java - 从Java中的另一个线程访问变量

转载 作者:行者123 更新时间:2023-12-01 10:16:14 24 4
gpt4 key购买 nike

我正在编写一个在 Java 上使用套接字通信的小代码,并且我正在尝试执行以下操作:

  1. 接收 JSON 对象并解析它[完成]
  2. 如果收到的命令是登录,则开始登录[完成]
  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从那里传输出来,以便我可以从if级别out.println它或访问out 从该方法而不使 out 最终?

最佳答案

PrintWriter out 声明为 Activity/fragment 中的全局变量

关于java - 从Java中的另一个线程访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35875240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com