gpt4 book ai didi

java - 从锁定机制中更新fragment中的ListView锁定UI线程

转载 作者:行者123 更新时间:2023-12-02 10:57:41 24 4
gpt4 key购买 nike

我有一个 ListView,我想用来自蓝牙套接字的消息来更新它。 ListView 在一个 fragment 中,这并不重要。
当我想监听来自套接字的传入消息(这是一个单独线程上的锁定机制)并使用接收到的消息更新 ListView 时,问题就出现了。
FChat.java

public class FChat extends Fragment {
ArrayList<String> listItems=new ArrayList<String>();
ArrayAdapter<String> itemsAdapter;
....
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//setup list view
ListView messageContainer = (ListView) thisView.findViewById(R.id.btMessagesContainer);
itemsAdapter = new ArrayAdapter<String>(thisView.getContext(), android.R.layout.simple_list_item_1, listItems);
currentAct = getActivity();
Thread test = new Thread() {
public void run() {
try {
currentAct.runOnUiThread(new Runnable() {
@Override
public void run() {
listItems.add("other:" + String.valueOf(times));
try {
String reply = bluetoothConnector.readSingleMessage();
listItems.add("other:" + reply);
itemsAdapter.notifyDataSetChanged();
}
catch (IOException e) {
e.printStackTrace();
}
}
});
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
test.start();

}
}

所以,这感觉就像它完全阻塞了 UI 线程,所以我猜 runOnUiThread 它阻塞了 UI 线程。
如果我把阻挡部分去掉 String reply = bluetoothConnector.readSingleMessage();并将其替换为 String reply = "test"它工作正常,用户界面已更新并且似乎工作得很好。
所以,我的问题是,如何从套接字读取数据并用其内容更新 ListView ?
谢谢

最佳答案

显然它阻塞UI线程

你的代码在伪代码中的样子:

Thread {
//there is separate thread
UiThread{
//there is UI thread
blockingOperation()
}
}

换句话说,你当前的线程几乎没用,因为你在 UI 线程中进行了阻塞操作。

并且肯定它适用于

String reply = "test"

因为这不是阻塞操作。

所以要解决问题只需移动

String reply = bluetoothConnector.readSingleMessage();

单独线程内:

Thread test = new Thread() {
public void run() {
try {
final String reply = bluetoothConnector.readSingleMessage();
currentAct.runOnUiThread(new Runnable() {
@Override
public void run() {
listItems.add("other:" + String.valueOf(times));
listItems.add("other:" + reply);
itemsAdapter.notifyDataSetChanged();
}
});
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};

关于java - 从锁定机制中更新fragment中的ListView锁定UI线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51592845/

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