2 starbenx starbenx 于 2016.02.29 15:14 提问

从SurfaceView类中向主UI发送消息

我想在子线程的子类中向UI线程发送消息更新界面.
首先成功了一个小例子:
mainActivity{
Handler h = new
@Override
public void handleMessage(Message msg){
一堆更新UI操作...
};

Runnable r = new Runnable() {
@Override
public void run() {
subclass s = new subclass(h);
subclass.do();
}
};

protected void onCreate(Bundle savedInstanceState).......
}

public class subclass{
public Handler mh;
public subclass (Handler h){
mh = h;
}
public void do(){
Message msg = mh.obtainMessage();
msg.sendToTarget();
}
}
但是我将子类subclass换成SurfaceView,构造器为
public SurfaceView(Context context, Handler h) {mh = h}
然后在CALLBACK 的surfaceCreated中向主线程传递消息时报错
public void surfaceCreated(SurfaceHolder holder) {
Message msg = mh.obtainMessage();
msg.sendToTarget();
}
错误提示为: Can't create handler inside thread that has not called Looper.prepare()
问题发生在构造子类时就出错了,位置:
主类:
mPreview = new SurfaceView(MainActivity.this, h);
子类:
public SurfaceView(Context context, Handler h) {mh = h}
请问是咋回事啊

1个回答

starbenx
starbenx   2016.02.29 15:44

找到问题了,好像是surfaceview不能在子线程中构造,我把surfaceview的构造移到UI线程的handler中,然后在主类中用sendmessage触发就OK了

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
[转载]框架类和view互发消息
VC EVC中均可 代码如下: 向view发消息  CView *pview;  pview=GetActiveView();//获得view的句柄  pview->SendMessage(WM_MY_MESSAGE); //发消息 向主框架发消息 CFrameWnd * active = GetActiveFrame();//获取当前主窗口框架指针 if(
MFC中对话框向视图类的数据发送
最近在做一个界面上的东西:需要在工具栏中点击按钮弹出一个对话框,这个对话框需要根据视图类里面的 变量进行更新对话框里面combox的内容,同时对话框需要将变化的内容发送给视图类,这就涉及到了对话框 和视图类之间的信息传递。   首先需要说明的一点是因为需要进行数据传递,所以不能使用模态的对话框,必须使用非模态的对话框, 也就是不能使用DoModel函数,我刚开始遇到的问题时视图类如何知道
android中实现在工作线程中向主线程发消息
android中实现在工作线程中向主线程发消息 1、view UI界面设计:在mainLayout中创建一个progressbar、一个button、一个textview,并为他们添加id;其中button需添加onclick事件 2、model模型层、控制层: 在Activity中(1)初始化3个view组件,(2)创建onclick方法统统new Thread()通过其run()及其中嵌
Android:子线程向UI主线程发送消息
在Android里,UI线程是不允许被阻塞的,因此我们要将耗时的工作放到子线程中去处理。 那么子线程耗时处理后要怎样通知UI线程呢?我们可以在UI主线程中创建一个handler对象,然后通过重写其handleMessage(Message msg)的方法,该方法会接收到子线程中的handler对象的sendMessage((Message msg)发回来的消息。这样一发一收就完成工作;而关于主线程
工作线程中利用handler向主线程发送消息
首先,可以先了解下线程间通信时Message,Handler,MessageQueue,Looper之间的关系解释下. Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再由Handler进行Message的分发和处理. Message Queue(消息队列):用来存放通过Handler发布的消息,通常附属于某一
从Dlg向xxxView类发送自定义消息
从Dlg向xxxView类发送自定义消息 第一步:在Dlg.h文件中定义消息 #define (自定义消息名)    WM_USER+1001 eg:#define WM_MYMESSAGE  WM_USER+1001 第二步:在xxxView.h文件的AFX_MSG块中声明消息处理函数: eg: afx_msg LRE
MFC 在线程中通过PostMessage更新界面主线程
MFC 在线程中通过PostMessage更新界面主线程
线程中向主对话框发送消息
参考网上的例子,弄了个小程序试验.... 建一个MFC对话框项目,添加一个按钮用来创建线程。 定义消息 #define WM_THREADOVER (WM_USER+1111) 对话框类中声明函数:     afx_msg LRESULT OnThreadOver(WPARAM   wParam,LPARAM   lParam);  定义消息响应函数 LRESULT CXXXDlg:
在MFC中从一个线程工作函数中向窗口发送消息以及窗口到窗口消息传送方法
前一段时间使用MFC写程序的时候,为了实现从一个窗口向另一个窗口发送消息,使用过下面两种方法 /*方法一:通过用SDK的标准API来查找其他对话框窗口返回句柄,并且发送信息 HWND hWnd;  //通过SDK的FindWindow函数得到目标窗口的句柄,TriTest为目标窗口的Caption的值  if(!(hWnd = ::FindWindow(NULL,"TriTes
C#使用委托实现主窗体向子窗体发送消息
/* * 【1】申明委托(定义一个函数原型:返回值,参数类型和个数) * 【2】根据委托,定义一个目标方法(目标方法可以有多个),注意目标方法和委托的返回值以及参数类型个数必须保持一致 * 【3】创建委托对象,关联目标方法 * 【4】通过委托来调用方法,而不是直接使用方法 */ 主窗体代码: public delegate void ShowMessage( string