看别人的代码,能学到很多自己以前不怎么会,还经常纠结的问题。记一下小笔记。
有一个A类,他是一个很普通的工具类,在这个类中获取到一些数据,想把这些数据传到主线程中去进行解析(就是传到MainActivity中),这时用Handler实现。
说一些题外话,我目前遇到的问题是,在MainActivity中有一个刷卡的流程,这个流程其实是用JNI来实现的,所以,我想要获取到的数据是,这个流程走完之后最后提供的,现在我的代码是,调用这个JNI的方法开始流程的两行代码,然后下面就是,我获取数据的get()方法,这个流程的最终的回调是在一个普通的A类中,我在A类中获得数据之后,封装到一个工具类中,然后在A类中给这个工具类设置一个成员变量,并且写好set,get方法,然后在MainActivity中,调用JNI方法的两行代码下面调用了A.getxxx();然后他就报空了。。。
原因:开始流程的那两行JNI的代码开始执行,流程还没有走完的同时,调用到了A.getxxx(),这时流程还没有走完,A类中的setxxx()方法还没有走,直接get当然就报错了。
解决方案:既然流程的最终回调是在A类中,刷卡之后的数据也是在A类中,那么就在A类中得到数据之后,封装好之后,给MainActivity发送Handler,当然封装好的数据也以参数的方式一并传到MainActivity中。然后在MainActivity中获取到数据之后进行解析或者页面上显示。
那么现在最终的问题来了,在一个很普通的类中怎么创建一个handler,并且还sendMessage给MainActivity中的Handler,让他去接受并且去实现呢(这个问题其实一直搞不明白,现在理解了之后真是简直菜的不能再菜)
在A类中:
Handler handler;
public void init_handle(Handler uiHandle)
{
handler=uiHandle;
}
然后在MainActivity中调用 A.init_handle(mainHandler);这样A类中的handler就已经初始化了。其中mainHandler是MainActivity中定义的Handler。然后在A类中还要自定义一个sendMessage 的方法:
public void sendMyMessage(int what,int arg1,int arg2,Object objStr)
{
if(handler!=null)
handler.obtainMessage(3, arg1, arg2, objStr).sendToTarget();
}
然后在A类中把得到的数据封装成一个工具类之后调用
sendMyMessage(int what,int arg1,int arg2,Object objStr);
objStr这个就是我的封装好的工具类。arg1就是唯一标识。
在MainActivity中Handler的handleMessage方法中:
case arg1:
infoLog = (BalanceLogInfo) msg.obj; //BalanceLogInfo就是封装好的工具类
if(infoLog != null){
TextView.setText(infoLog.getName());
….
(这里我的代码是得到infoLog之后,new适配器,然后给ListView设置设配器,在终端显示)
}
好了,想记的就这些,这样的话,整个流程才是对的,流程走完—获取到数据—handler发送给主线程—主线程中去处理—显示到终端页面。整套的流程才会结束。
普通类中用handler发送数据到主线程去处理
最新推荐文章于 2025-04-07 16:59:28 发布