之前在寫一支程式,為了將Cyberlink UPnP API的 NotifyListener 有SSDP message丟進來時,將其丟至UI Thread,但會出現Only the original thread that created a view hierarchy can touch its views.錯誤訊息。大致上是說非UI Thread不能去更新View(參考),需利用handler來處理。
package com.example;
import java.util.Timer;
import java.util.TimerTask;
import org.cybergarage.upnp.ControlPoint;
import org.cybergarage.upnp.device.NotifyListener;
import org.cybergarage.upnp.ssdp.SSDPPacket;
import android.R.integer;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.method.ScrollingMovementMethod;
import android.widget.TextView;
public class UPnPOnAndroid3Activity extends Activity {
/** Called when the activity is first created. */
private MyHandler mHandler;
private TextView tView;
private int i=0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tView=(TextView)findViewById(R.id.textView1);
tView.setMovementMethod(ScrollingMovementMethod.getInstance()); //textview可以捲動(參考)
mHandler = new MyHandler();
ControlPoint cPoint = new ControlPoint();
if(cPoint.start()){
tView.append("Start...\n");
}else{
tView.append("Stop...\n");
cPoint.stop();
}
cPoint.addNotifyListener(new NotifyListener() {
public void deviceNotifyReceived(SSDPPacket arg0) {
// TODO Auto-generated method stub
Message msg = new Message();
msg.obj=arg0; //將送來的SSDPPacket丟到msg.obj
mHandler.sendMessage(msg); //透過Handler來傳message
}
});
}
private class MyHandler extends Handler{
public void handleMessage(Message msg){
super.handleMessage(msg); //透過Handler收message
tView.append(msg.obj + "\n"); //print至textview
}
}
}
沒有留言:
張貼留言