gpt4 book ai didi

java - 使用处理程序更新 UI 线程

转载 作者:行者123 更新时间:2023-12-01 14:17:30 26 4
gpt4 key购买 nike

我在网上搜索了明确的示例,但到目前为止找不到可以应用于我的项目的示例。

我正在尝试创建一个每 100 毫秒运行一次的工作线程。然后它应该用结果更新 UI。经过一番研究后,我决定我可能应该使用处理程序来管理 UI 更新。我得出了这个解决方案:

我的 Activity 处理程序:

private  final Handler handler = new Handler() {

public void handleMessage(Message msg) {

String aResponse = msg.getData().getString("message");

if ((null != aResponse)) {

// ALERT MESSAGE
Log.v("udppacket", "UDP message!");
if (msg.obj != null)
{
ManagerUdpPacket p = (ManagerUdpPacket) msg.obj;
operatorListFragment.updateContent((int) p.getOperationTime());
}
}
else
{

}

}
};

我的另一个具有工作线程的类:

public class ManagerUdpReceiver 
{
private int minPort = 1234;
private int maxPort = 1240;
private ArrayList<PortListener> portList;
private Handler handler;
private Thread portThread;
private int queryInterval = 100;
private boolean stop = false;


public ManagerUdpReceiver(int minport, int maxport, Handler handler, int queryInterval)
{
minPort = minport;
maxPort = maxport;
this.handler = handler;
this.queryInterval = queryInterval;

//create port listeners from given range and start their threads


start();
}

private void start()
{
stop = false;
// Create Inner Thread Class
portThread = new Thread(new Runnable()
{
// After call for background.start this run method call
public void run()
{

if (portList == null)
{
portList = new ArrayList<PortListener>();
for (int i = minPort; i < maxPort; i++)
{
portList.add(new PortListener(i));
}
}

if (!stop)
{
ManagerUdpPacket p = portList.get(0).receive();
threadMsg("moi", p);
//mHandler.postDelayed(this, queryInterval);

}
else
{
//stop execution and close ports
for (int i = 0; i < portList.size(); i++)
{
portList.get(i).close();
}
}


}

//send message to the handler
private void threadMsg(String msg, ManagerUdpPacket p)
{
if (!msg.equals(null) && !msg.equals(""))
{
Message msgObj = handler.obtainMessage();
//msgObj.obj = p;
Bundle b = new Bundle();
b.putString("message", msg);
msgObj.setData(b);
handler.sendMessage(msgObj);
}
}
});

// Start Thread
portThread.start();
}



public void close()
{
stop = true;
}
}

当我运行该程序时,我收到有关在 UI 线程中运行网络代码的异常。现在,工作线程应该接收并处理 UDP 数据包。然而,该代码位于 portThread 线程内部!我想 handler.postDelayed(this, queryInterval);我用它每 100 毫秒循环一次线程,不知何故导致下一个周期在 UI 线程而不是我的工作线程中运行。

所以我的问题是我在这里做错了什么以及如何解决它?或者,如何让循环每 100 毫秒正确工作一次?我也不确定将处理程序放置在哪里,因为我已经看到过它位于 Activity 内部和工作线程内部的示例。

最佳答案

好吧,我想我已经成功了,尽管我对它不满意,所以不检查它。

基本上,我最终使用 TimerTask 每 100 毫秒运行一次代码,并通过 Handler 通知 UI 线程。我不太确定这是否是最好的选择(我听说计时器不是那么好),但似乎有效:

dataStreamTimer = new Timer();
dataStreamTask = new TimerTask()
{
public void run()
{

if (portList == null)
{
portList = new ArrayList<PortListener>();
for (int i = minPort; i < maxPort; i++)
{
portList.add(new PortListener(i));
}
}

if (!stop)
{

ManagerUdpPacket p = portList.get(0).receive();
threadMsg("moi", p);
//handler.postDelayed(this, queryInterval);

//stop thread until next query
try {
synchronized(this){
this.wait(queryInterval);
}
} catch (InterruptedException e) {
Log.e("ERR", "InterruptedException in TimerTask.run");
}
}
else
{
//execution has been stopped, clear data:
//stop execution and close ports
for (int i = 0; i < portList.size(); i++)
{
portList.get(i).close();
}
}

}

关于java - 使用处理程序更新 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17990813/

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