先说说具体情况,我是在写音乐播放器的时候想到这个问题的,音乐播放器返回主界面后再次进入的时候会出现seekbar跳动现象,这是因为,ui线程之前得到的seekbar.progress的值是一个,再次进入后,playservice发送过来的却过了一段时间了,所以会有跳动现象(当然还遇到了其他问题,这个后面再说)
所以就想到了:
其他线程向ui线程发送数据,ui线程接受数据
这个的实现方式,一般用的都是handler message,一个线程或timer不断发送消息,ui不断接受消息,
这个我试了试,在程序退出后,timer还在发送消息,handler还在处理消息
还有一种方式,就是用receiver接受并处理消息(广播),这个就没有上面的方法好了,这个在程序退出的时候如果不unregistreceiver 就会报错,如果添加unregisreceiver,那么就不会继续接受广播,当然两种都未能继续接受广播,
所以,只有handler方法可以达到目标,可惜我在音乐播放器中用的是第二种,有空得改掉才行
::其他方法暂时还没能想到
package com.droidstouc.handler.test;
import java.util.Timer;
import java.util.TimerTask;
import android.R.integer;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;
/**按退出键后,new timer.schedule不断在后台运行,handler不断接受数据,
* onpause onstop ondestroy 都被调用,但是timer还在后台运行,handler也在后台接受数据
*
* 用receiver接受数据,如果不再onpause中注销receiver,会报错, ( Are you missing a call to unregisterReceiver()?)
* 不论注销不注销,程序退出后,receiver都无法再接受数据
*
* */
public class TwoActivity extends Activity {
TextView tView;
int num;
Handler myHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
tView.setText(""+msg.obj);
System.out.println("msg"+msg.obj);
};
};
MyReceiver myReceiver;
public static final String TEST="test";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
tView = new TextView(this);
tView.setText("begin?");
setContentView(tView);
myReceiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(TEST);
registerReceiver(myReceiver, intentFilter);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("timer..");
//发送messgae给handler
Message msg = new Message();
msg.obj = num++;
myHandler.sendMessage(msg);
//发送广播给receiver
Intent intent = new Intent(TEST);
intent.putExtra("obj", num);
sendBroadcast(intent);
}
},2000, 200);
}
private class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
int broadcastMsg=intent.getIntExtra("obj", 0);
System.out.println("my receiver is ==------num: "+broadcastMsg);
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.e("TAG","onPause..");
myReceiver = null;
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.e("TAG","onStop..");
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.e("TAG","onDestroy..");
}
}