java - Android/java - 更改 Runnable 类中的按钮可见性

标签 java android events event-handling serversocket

我创建了一个带有服务器套接字的类,该套接字接受来自客户端的传入连接。现在我需要在客户端连接时显示一个按钮。我该怎么做?我必须实现一个事件监听器吗? 这是服务器类:

public class MyServer implements Runnable {

    public int serverPort = 8080;
    public String serverIp = "http://192.168.1.115";
    public Handler handler = new Handler();
    public TextView serverStatus;
    public ServerSocket serverSocket;
    MyServerMethods myServerMethods = new MyServerMethods();

    @Override
    public void run() {
        try{
          ServerSocket parent = new ServerSocket(); //create a new socket
          parent.setReuseAddress(true);
          parent.bind(new InetSocketAddress(serverPort)); //bind the server port and reuse it if necessary
            if ( serverIp != null){
                Log.i("Status","READY");
                while (true){
                    Socket client = parent.accept(); //accept the incoming connection
                        try{
                            String path = myServerMethods.readRequest(parent, client);
                            Log.i("PATH",""+path);
                            if (path.contains("FitListXml")){
                                myServerMethods.sendXmlFile(client);
                            } else {
                                myServerMethods.sendPhotoFile(client, path);
                            }

                        } catch (Exception e){
                            e.printStackTrace();
                        }
                    }
            } else{
                Log.i("Error","Internet connection not present");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这是我声明按钮的主要 Activity (我已经删除了问题中无用的元素)。

public class AndroidServer2 extends Activity {

private Button closeConnectionButton;
int serverPort = 8080;
Thread fst = new Thread(new MyServer()); //declaration of a new thread

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_android_server2);
}

@Override
protected void onResume(){
    super.onResume();
    if (fst.isAlive() == false){
        fst.start();
    }
}

@Override
  protected void onPause() {
    super.onPause();
    try {
        fst.interrupt();
    } catch (Exception e) {
        e.printStackTrace();
    }
  }

}

谢谢

最佳答案

您可以使用 Activity 的 runOnUiThread 方法来设置按钮可见性。

public class MyServer implements Runnable {

public int serverPort = 8080;
public String serverIp = "http://192.168.1.115";
public Handler handler = new Handler();
public TextView serverStatus;
public ServerSocket serverSocket;
MyServerMethods myServerMethods = new MyServerMethods();

private AndroidServer2 mActivity;

MyServer(AndroidServer2 activity) {
    mActivity = activity;
}

@Override
public void run() {
    try{
      ServerSocket parent = new ServerSocket(); //create a new socket
      parent.setReuseAddress(true);
      parent.bind(new InetSocketAddress(serverPort)); //bind the server port and reuse it if necessary
        if ( serverIp != null){
            Log.i("Status","READY");
            while (true){
                Socket client = parent.accept(); //accept the incoming connection

                // Client connected now set the button visibilty
                mActivity.runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        mActivity.setButtonVisible();
                    }
                });

                try{
                    String path = myServerMethods.readRequest(parent, client);
                    Log.i("PATH",""+path);
                    if (path.contains("FitListXml")){
                        myServerMethods.sendXmlFile(client);
                    } else {
                        myServerMethods.sendPhotoFile(client, path);
                    }

                } catch (Exception e){
                    e.printStackTrace();
                }
            }
        } else{
            Log.i("Error","Internet connection not present");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

AndroidServer2 类:

public class AndroidServer2 extends Activity {

    private Button closeConnectionButton;
    int serverPort = 8080;
    Thread fst = new Thread(new MyServer(this)); //declaration of a new thread

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_android_server2);
    }

    @Override
    protected void onResume(){
        super.onResume();
        if (fst.isAlive() == false){
            fst.start();
        }
    }

    @Override
      protected void onPause() {
        super.onPause();
        try {
            fst.interrupt();
        } catch (Exception e) {
            e.printStackTrace();
        }
      }

    public void setButtonVisible() {
        closeConnectionButton.setVisibility(View.VISIBLE);
    }
}

关于java - Android/java - 更改 Runnable 类中的按钮可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17681088/

相关文章:

android - 谷歌插件服务给我一个错误

jquery - 如何在 Safari for iPad 中使用 jQuery 识别触摸事件?可能吗?

java - Spring Boot 测试无法 Autowiring 服务类

java - 如何通过 Spring Web 服务器将 HTTP 视频流代理到任意数量的客户端

java - 未知错误: cannot determine loading status from disconnected: Unable to receive message from renderer error with Selenium Java scripts on jenkins

java - 比较 ArrayList 中的 JSONArray 列表

android - 无法在 Intellij : "Warning: debug info can be unavailable." 中调试 android 应用程序

events - Google Maps api v3 多边形编辑事件未在所有句柄上触发

.net - 在运行时以通用方式将事件处理程序分配给对象实例

java - Struts2 提交按钮方法调用不会触发