android其他线程向ui线程发送数据

来源:互联网 发布:mac 网页开发工具 编辑:程序博客网 时间:2024/05/17 08:34

先说说具体情况,我是在写音乐播放器的时候想到这个问题的,音乐播放器返回主界面后再次进入的时候会出现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";@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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() {@Overridepublic void run() {// TODO Auto-generated method stub    System.out.println("timer..");    //发送messgae给handlerMessage msg = new Message();msg.obj = num++;myHandler.sendMessage(msg);//发送广播给receiverIntent intent = new Intent(TEST);intent.putExtra("obj", num);sendBroadcast(intent);}},2000, 200);}private class MyReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubint broadcastMsg=intent.getIntExtra("obj", 0);System.out.println("my receiver is    ==------num: "+broadcastMsg);}}@Overrideprotected void onPause() {// TODO Auto-generated method stubsuper.onPause();Log.e("TAG","onPause..");myReceiver = null;}@Overrideprotected void onStop() {// TODO Auto-generated method stubsuper.onStop();Log.e("TAG","onStop..");}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();Log.e("TAG","onDestroy..");}}



0 0