gpt4 book ai didi

android - mainActivity.runOnUiThread 更新表中的数据太慢

转载 作者:行者123 更新时间:2023-11-29 20:42:41 25 4
gpt4 key购买 nike

我有一个向消费者提供数据的生产者线程,如果我将这些数据打印到 logcat,它会非常快速地工作。一旦我尝试使用 runOnUiThread 在 ui 中更新我的表,一些数据就会显示,等待任意时间,然后继续更新直到完成。这个过程可能需要几分钟而不是一秒钟。

public class DeviceFragment extends Fragment {
static Boolean loop = true;
static Object lock = new Object();
static SnmpPdu pdu;

//handlers initialized in onCreate

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);

final SnmpWalk snmpWalk = new SnmpWalk(ipAddress, PDUs, lock);
looperThreadProducerHandler.post(snmpWalk);
looperThreadConsumerHandler.post(new Runnable() {
@Override
public void run() {

while (snmpWalk.getWalkStart()) {
synchronized(PDUs) {
if (PDUs.size() != 0) {
pdu = PDUs.remove(0);
Log.d("test", "" + pdu.toString());//this will print fine if i don't call the doWork method
try {
doWork(pdu); //display to ui
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}

}
}
public void doWork(SnmpPdu pdu) throws InterruptedException {
final TableLayout deviceTable = (TableLayout) getView().findViewById(R.id.deviceTable);
final TableRow row = new TableRow(getActivity());
//skip row initalizers here
loop = false;
mainActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
deviceTable.addView(row);
synchronized(lock) {
loop = true;
lock.notify();
}

}
});
synchronized(lock) {
while (!loop) {
lock.wait();
}
}
}
}
}

最佳答案

您的问题是由于两个 synchronized block 同时处理同一个锁。它首先会在 Runnable 之外锁定,然后尝试在 Runnable 内部再次锁定。

synchronized(lock) {
loop = true;
lock.notify();
}

synchronized(lock) {
while (!loop) {
lock.wait();
}
}

这可以很容易地转换为:

loop = true;

while (!loop) { }

关于android - mainActivity.runOnUiThread 更新表中的数据太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30784009/

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