写完Java节拍器,本以为能够很容易的过渡到Android节拍器。后来发现不对。在网上查询了之后,才知道,Android考虑到线程安全问题,不允许在线程中执行UI线程。这里我们要学到一个Android中重要的类:android.os.Handler,这个可以实现各处线程间的消息传递。

我们可以在原先的TimerTask子类MyTimerTask的方法run()中,只是给Handler发送一个Message。我们让Handler进行UI线程上的操作(在节拍器的例子中,指的是更新那个显示节拍的控件的数值)。

最终节拍器打节拍的同时发生。(由于时间原因,音量控制尚未实现)实现截图如下:


Android节拍器&定时程序

package com.Android.Jiapaiqi;import android.app.Activity;import android.content.Context;import android.media.AudioManager;import android.media.SoundPool;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.SeekBar;import android.widget.TextView;import android.widget.SeekBar.OnSeekBarChangeListener;import java.util.Timer;import java.util.TimerTask;public class ActivityMain extends Activity {Button button_start;Button button_stop;EditText edit_sudu;EditText edit_paishu;TextView result;SeekBar seekbar;public float tempo;public int section;public int pp;Handler handler;Timer mytimer;private SoundPool sndHigh;private SoundPool sndLow;private int hitOfHigh;private int hitOfLow;//声音控制private AudioManager audioManager;//声音变量private int volume=0;//声音模式//private int mode;//是否有声音private int flag=1;//内部类class MyTimerTask extends TimerTask{@Overridepublic void run() {Message message=new Message();message.what=1;handler.sendMessage(message);}};    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);         pp=1;        setContentView(R.layout.main);final EditText edit_sudu = (EditText)this.findViewById(R.id.edit_sudu);final EditText edit_paishu = (EditText)this.findViewById(R.id.edit_paishu);final TextView result = (TextView)findViewById(R.id.result);handler = new Handler(){public void handleMessage(Message msg){switch(msg.what){case 1:result.setText(String.valueOf(pp));if(pp==1)// play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)//播放音频,可以对左右音量分别设置,还可以设置优先级,循环次数以及速率sndHigh.play(hitOfHigh, 1, 1, 0, 0, 1);elsesndLow.play(hitOfLow, 1, 1, 0, 0, 1);if(pp!=section){pp++;}else{pp=1;}break;}super.handleMessage(msg);}};button_start = (Button) findViewById(R.id.button_start);button_start.setOnClickListener(new OnClickListener() {public void onClick(View v) {tempo=Float.parseFloat(edit_sudu.getText().toString()); section=Integer.parseInt(edit_paishu.getText().toString()); mytimer=new Timer();float tempFloat=60/tempo*1000;mytimer.schedule(new MyTimerTask(),0, (long)tempFloat);}});button_stop = (Button) findViewById(R.id.button_stop);button_stop.setOnClickListener(new OnClickListener() {public void onClick(View v) {mytimer.cancel();sndHigh.pause(hitOfHigh);sndLow.pause(hitOfLow);}});final SeekBar seekbar = (SeekBar) findViewById(R.id.seekbar);//设置拖动条的初始值和文本框的初始值seekbar.setMax(7);seekbar.setProgress(5);seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {// TODO Auto-generated method stub}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub}});audioManager = (AudioManager) getBaseContext().getSystemService(Context.AUDIO_SERVICE);//通过getStreamVolume获得当前音量大小volume=audioManager.getStreamVolume(AudioManager.STREAM_RING);//把当前音量的值 设置给进度条//seekbar.setProgress(volume);sndHigh = new SoundPool(10, AudioManager.STREAM_SYSTEM,5);//载入音频流hitOfHigh = sndHigh.load(getBaseContext(), R.drawable.high, 0);sndLow = new SoundPool(10, AudioManager.STREAM_SYSTEM,5);//载入音频流hitOfLow = sndLow.load(getBaseContext(), R.drawable.low, 0);    }}

再给出一篇比较好的文章:

Android计时器正确应用方式解析

http://developer.51cto.com/art/201001/180254.htm

更多相关文章

  1. Android的线程模型
  2. Android 多线程AsyncTask详解
  3. Android 多线程之 AsyncTask
  4. android主线程和子线程的区别
  5. Android节拍器
  6. Android之——多线程下载示例
  7. Android中关于线程使用的几点注意事项

随机推荐

  1. android设置屏幕禁止休眠的方法
  2. android动画Android(安卓)动画实践
  3. 使用NDK开发SQLite3
  4. 豆瓣开源许可-android
  5. android中LayoutInflater的使用
  6. android Camera照相机技术(一)
  7. Android四大基本组件介绍与生命周期
  8. Android(安卓)4.4 KitKat 支持 u 盘功能
  9. Android单个模块编译
  10. 我的Android(安卓)4 学习系列