当前位置: 代码迷 >> Android >> 睡不着觉-安卓计数器给小弟我数绵羊
  详细解决方案

睡不着觉-安卓计数器给小弟我数绵羊

热度:26   发布时间:2016-04-28 04:29:49.0
睡不着觉--安卓计数器给我数绵羊

???????? 最近长沙天气有点让人抓狂了,宿舍更是睡觉禁地,大晚上睡不着觉,半夜惊醒,一身IT闷骚汗,嗨,又是难眠夜~_~

???????? 睡不着的时候就打开电脑,闲来无事,刚好前几天安卓入门,便突发奇想,弄一个计数器来数绵羊(当然,只是一个计数器,可能需要接入手机的音响端口才能发声吧),哈哈,全当是练习安卓上的线程应用小程序,路人就当看看热闹,大神见笑。

??????? 首先介绍一下,如果有部分java基础的同学就会觉得就用一个线程就ok了,安卓上应该也差不多吧,但这里要注意,安卓里的线程不能直接访问UI的组件,这里就需要用到安卓里的一个Hander对象。

??????? hander英文有处理者的意思。他就相当于一个邮递员(介于主线程和子线程之间),他可以在邮局(主线程)和用户(子线程)之间传递信息。

??????? 当安卓启动一个主线程(邮局开门了),子线程(用户)通过Handler(邮递员)将Message(邮件)传给主线程的UI(邮局),这是大致的框架。

?????? 当然在细节方面,当我们发送消息的时候,会调用回调函数,即Callback接口对象,当线程发送数据过来时,会调用该几口的handMessage方法。

?????? 代码如下:

package com.example.count;import android.os.Bundle;import android.os.Handler;import android.os.Handler.Callback;import android.os.Message;import android.app.Activity;import android.widget.TextView;public class MainActivity extends Activity {	//文本视窗    private TextView timeView;    //创建Handler对象:把Callback对象通过构造方法传进去,    //在子线程中调用主线程中的hander对象把Message对象发送出去    private Handler handler;	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main); 			//通过文本的ID获取文本的内容对象		timeView = (TextView)findViewById(R.id.timeView);		//创建回调接口对象,当handler接收到消息时调用该接口的		//handleMessage方法,此处采用匿名内部类重写hanleMessage方法		Callback callback = new Callback(){			public boolean handleMessage(Message msg){		           //这里可以直接访问ui上的组件				int second  = msg.arg1;				  //更新数据在界面上的显示				timeView.setText(String.valueOf(second));				return true;			}		};	   //创建Handle对象		handler = new Handler(callback);			//创建计时线程,此为子线程		Thread t = new Thread(){		   int second = 0;		   public void run(){			   //休眠1s,实现计时效果			   while(true){				   try {					   Thread.sleep(1000);				   } catch (InterruptedException e) {					   e.printStackTrace();				   }				   second++;				   //通过Message对象传递数据				   Message msg = new Message();				   //通过Message对象传递数据				   msg.arg1 = second;				   //通过 handler对象接收消息,并调用上面写的回调Callback对象的				   //handleMessage方法				   handler.sendMessage(msg);			   }		   }        };        //在主线程中启动子线程        t.start();	}}

?以上纯属小弟愚见,有问题虚心接受。

  相关解决方案