웹을 조사하여 확실한 예제를 찾았지만 지금까지 프로젝트에 적용 할 수있는 것을 찾지 못했습니다.처리기를 사용하여 UI 스레드 업데이트
저는 100ms마다 실행되는 작업자 스레드를 만들려고합니다. 그런 다음 UI를 결과로 업데이트해야합니다. 몇 가지 조사를 한 후에 UI 업데이트를 관리하기 위해 Handlers를 사용해야한다고 결정했습니다.
내 활동의 처리기 : 나는이 프로그램을 실행하면
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;
}
}
내가 네트워킹 코드를 실행에 대한 예외를 얻을 : 작업자 스레드를 가지고
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
{
}
}
};
내 다른 클래스 I이 솔루션에 온 UI 스레드에서. 이제 작업자 스레드는 UDP 패킷을 받아 처리해야합니다. 그러나 그 코드는 portThread 스레드 안에 있습니다! 나는 그 handler.postDelayed (this, queryInterval); 나는 매 100ms마다 스레드를 루프 처리하는 데 사용하여 어떻게 든 다음 작업주기가 내 작업자 스레드 대신 UI 스레드에서 실행되게합니다.
내 질문은 내가 여기서 잘못하고 어떻게 해결할 수 있습니까? 아니면 100ms마다 루핑 작업을 올바르게 수행하는 방법은 무엇입니까? 또한 Activity 내부와 worker-thread 내부의 예제를 보았 기 때문에 Handler를 어디에 둘지 확실치 않습니다.
이 부분을 살펴볼 수 있습니다. http://stackoverflow.com/questions/6223389/do-some-android-ui-stuff-in-non-ui-thread?lq=1 또한 배경 스레드에서 루프에서 코드를 실행할 수 있습니다 – sej101