gpt4 book ai didi

java - Android 线程错误

转载 作者:行者123 更新时间:2023-12-01 12:54:50 25 4
gpt4 key购买 nike

我实际上正在开发一个聊天 Android 应用程序。

我创建的线程有问题。基本上,我的客户端应用程序有一个连接到服务的 Activity 。该服务负责客户端和服务器之间的通信。 (我也使用 Asynctask 来实现)

我有两个主要场景:

  • 我向服务器发送请求(刷新好友列表、添加好友、登录...)并且服务器会做出响应,因此这没有问题。

  • 第二种情况是来自服务器的意外请求(当另一个人想要与您通信时)。为此,我在服务类中创建了一个线程,如下所示。

    公共(public)无效launchListener(){

            Runnable SocketListener = new Runnable(){

    public void run(){
    String msg = "";
    String[] msg_parts = {"","",""};
    while(true){
    try {
    if (in.available() > 0){
    msg = in.readLine();
    msg_parts = msg.split(" ");
    if (msg_parts[0].equals("CONNECTION")){
    Log.d("SocketService", "Broadcasting message");
    Intent intent = new Intent("ask.connection");
    intent.putExtra("nickname", msg_parts[1]);
    sendBroadcast(intent);
    }
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    };
    Thread t = new Thread(SocketListener);
    t.start();
    }

问题是,该线程仅等待“连接”,因此它还拦截来自服务器的预期响应,我不知道为什么,但该线程卡住了我的应用程序。这只是一种可能性,但也许是因为我也在另一个地方使用了 readLine,所以它不起作用。

这里我使用 readLine 来获取 Asyntask 中的预期响应:

protected String doInBackground(String... message) {
this.message = message[0];
this.out = service.getOut();
this.in = service.getIn();
try {
this.out.writeBytes(this.message + "\n");
this.out.flush();
} catch (IOException e) {

e.printStackTrace();
}

response = readLine(this.in);

return response;
}

我真的不知道为什么它不起作用,也许 asynctask readLine 首先读取响应,然后当我的线程读取它时,DataInputStream 为空并且卡住。

无论如何,感谢您的帮助!

最佳答案

如果 (in.available() > 0){ 计算结果为 false,如果您在单核设备上运行,则您正在浪费整个 CPU 核心你的设备会死机。

要缓解这种情况,请从 Thread.sleep 开始,然后进入 BlockingQueue http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html

此外,您正在从两个线程访问您的服务,我希望它是线程安全的。

while(true){
try {
if (in.available() > 0) {
msg = in.readLine();
msg_parts = msg.split(" ");
if (msg_parts[0].equals("CONNECTION")){
Log.d("SocketService", "Broadcasting message");
Intent intent = new Intent("ask.connection");
intent.putExtra("nickname", msg_parts[1]);
sendBroadcast(intent);
}
} else {
Thread.sleep(100); // Or any sufficient delay.
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
break;
}
}

关于java - Android 线程错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23979225/

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