2012年5月16日 星期三

android handler+message 之使用

之前在寫一支程式,為了將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
   
    }
    }
}

沒有留言:

張貼留言