请教关于Android中Looper的一个问题

问题描述

在循环中handler.sendMessage(msg)后,利用Looper.loop()来调用handler.handleMessage(msg),如何让loop()退出执行下个迭代?public class MainActivity extends Activity{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);MyView view = new MyView(this, null);setContentView(view);}// 自定义视图类class MyView extends View implements Runnable{// 图形当前坐标private int x=20, y=20;public MyView(Context context, AttributeSet attrs) {super(context, attrs);// 获得焦点setFocusable(true);// 启动线程new Thread(this).start();}@Overridepublic void run() {Looper.prepare();Handler refreshHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if(msg.what==0x101111){MyView.this.update();MyView.this.invalidate();}}};while(!Thread.currentThread().isInterrupted()){// 通过发送消息更新界面Message msg = refreshHandler.obtainMessage();msg.what = 0x101111;refreshHandler.sendMessage(msg);Looper.loop();try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 实例化画笔Paint paint = new Paint();// 设置画笔颜色paint.setColor(Color.GREEN);// 画圆canvas.drawCircle(x, y, 10, paint);}// 更新坐标private void update(){int h = 500;y += 5;if(y>=h)y = 20;}}} 问题补充:dongya1987 写道

解决方案

完全正确,因为你只send了一次message,handler当然只执行一次handleMessage。你的第一个问题补充说的很正确。另外这个例子写的很蹊跷。在handler的同一个线程中执行执行它的sendMessage,还有什么用呢,跟直接的函数调用又有什么却别呢?完全失去了用Handler的意义。Handler和Looper这个模型就是为了处理其他线程间的消息传递,在同一个线程内就失去意义了。
解决方案二:
在这个例子中,你应该把 Handler refreshHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if(msg.what==0x101111){ MyView.this.update(); MyView.this.invalidate(); } } }; 这段,拿到run方法外面,这样的话就不用Looper了,因为主线程会有默认的Looper对象除了消息,不用在程序中写。这是主线程跟其他线程区别的地方
解决方案三:
只要你能访问refreshHandler,并用发调用sendMessage发消息,该消息就会被refreshHandler所在线程的消息队列并将由handleMessage处理。你所要做的只是refreshHandler.sendMessage,其他的就不用管了。多次调用refreshHandler.sendMessage也没有关系,消息都会被送到refreshHandler所在线程的消息队列,它自己将处理
解决方案四:
Looper负责处理消息循环,Looper.loop()是开始消息循环,调用它之后循环已经开始,下一个由handler发的message将会被这个handler的handleMessage方法处理。这是一个----循环

时间: 2024-08-08 09:42:38

请教关于Android中Looper的一个问题的相关文章

android中如何让一个service无法被一键清理给清理掉

问题描述 android中如何让一个service无法被一键清理给清理掉 android中如何让一个service无法被一键清理给清理掉 比如音乐播放服务,一键清理对它无作用,除了添加白名单 还有其他一开始设计软件的时候就无法被清理的方法吗 解决方案 一键清理,与系统内存不足时自动清理是由区别的. 一键清理,只能通过增加白名单:否则,无论服务是否活动,都会被清楚. 解决方案二: 建议题主不要开发流氓软件 解决方案三: Service的粘性模式 实现 就算是被杀死了也会重新启动(虽然Service

想请教一下android中自定义布局实现的是什么?是让App自适应吗?

问题描述 想请教一下android中自定义布局实现的是什么?是让App自适应吗? 想请教一下android中自定义布局实现的是什么?是让App自适应吗? 解决方案 http://mobile.51cto.com/abased-459427.htm 解决方案二: 自定义,自己定义文件啊,,可以自己设置风格之类的,更加个性化 解决方案三: 你说的是自定义控件吧?实现的是View类 解决方案四: 自定义布局?你想说的是自定义view么?就是让你不仅仅局限于用它所提供的控件,自己去实现想要的的界面效果

求教android中如何控制一个activity在内存中的实例个数

问题描述 求教android中如何控制一个activity在内存中的实例个数 项目中有个需求,一个activity中有个按钮可以打开自己的另一个实例,那么这样就会出现不停的点,不停的创建这个activity实例的情况出现,有没有方法可以控制这个activity实例的个数啊,比如只保留最近打开的三个这个activity实例,有没有方法可以实现的啊,求教大神们 解决方案 android 让自己的Activity只创建一个实例 解决方案二: 机器人的回答没有用啊,需要是保存3个实例,不是一个啊 解决方

android中怎么实现一个自定义对话框

问题描述 android中怎么实现一个自定义对话框 android界面中,单击EditText弹出一个时间对话框, 解决方案 1.可以自定义对话框的布局 2.新建一个activity 设置android:theme="@style/mydialog" parent="@android:style/Theme.Dialog" ><br> <item name="android:windowNoTitle">true&l

android中泛型传入一个外部类,处理后传回原来的类,问题求解!

问题描述 android中泛型传入一个外部类,处理后传回原来的类,问题求解! 部分代码如下: 入口类定义一泛型private List itemlist; itemlist=new ArrayList(); 创建外部类对象 GetData getdata=new GetData(itemlist); getdata.returndata(): 包中的外部类 public class GetData extends Activity{ private List<Item_activity> it

android中如何把一个imageview放在另一个imageview的顶部?

问题描述 android中如何把一个imageview放在另一个imageview的顶部? 这是我设置的布局,一直没有成功 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_heig

android中怎么设置一个日期的自定义对话框

问题描述 android中怎么设置一个日期的自定义对话框 在android界面中,单击EditText,弹出一个日期对话框.应该怎么弄?求大神帮忙!!! 解决方案 参考android 点击EditText 弹出日期选择器DatePickerDialog 解决方案二: 上面的答案有帮助吗?如果还有问题,请提出来,如果对答案满意,请顶一下,并标记为采纳答案,谢谢!

请教:.net中如何重写一个服务器控件呢?

问题描述 .net中如何写一个服务器控件呢?我是初学者,请教请教,请大家详细解说解说! 解决方案 解决方案二:新建一个class,然后继承于WebControl,重写WebControl的Render等等方法.解决方案三:你想要重写什么控件,就继承该控件就好了,同时你不去继承已有控件,去实现相关的接口也是可以实现的

android中的service本质是一个类还是一个方法还是一个对象

问题描述 android中的service本质是一个类还是一个方法还是一个对象 android中的service本质是一个类还是一个方法还是一个对象 当然我明白java中一切都是对象的这种说法 解决方案 service在哪里看到的,作为类的定义它是类,对它实例化创建了对象并且执行就是对象了. 解决方案二: java中一切都是对象 这个说法其实不准确.你能说java中的关键字是对象么? 解决方案三: Service(服务)是Android 核心组件之一,特点就是Android系统帮你实例化他的对象