【android】通过handle,looper实现多线程数据同步
16lz
2021-01-24
代码如下:
public class MainActivity extends Activity {
private static final String TAG = "MainThread";
private Timer timer;
private TimerTask timerTask;
private Handler mMainHandle,mChildHandle;
private int i=0;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
timer = new Timer();
timerTask = new MyTimerTask();
mMainHandle = new Handler(){
public void handleMessage(Message msg) {
Log.e("mainhandle", i+"");
}
};
new ChildThread().start();
timer.schedule(timerTask, 0, 5000);
}
public class MyTimerTask extends TimerTask{
public void run() {
if(mChildHandle!=null){
Message childMsg = mChildHandle.obtainMessage();
mChildHandle.sendMessage(childMsg);
Log.e("thread", i+"");
}
}
}
public void onDestroy(){
Log.i(TAG,"stop looping the child threads message queue");
mChildHandle.getLooper().quit();
}
class ChildThread extends Thread{
public void run(){
Looper.prepare();
mChildHandle = new Handler(){
public void handleMessage(Message msg)
{
Log.i("child", "11111111");
i++;
Message toMain = mMainHandle.obtainMessage();
toMain.obj = this.getLooper().getThread().getName()+ i;
mMainHandle.sendMessage(toMain);
Log.i("i=",i+"");
}
};
Looper.loop();
}
}
}
LOG如下:
08-16 08:08:12.936: ERROR/thread(235): 0
08-16 08:08:12.939: INFO/child(235): 11111111
08-16 08:08:12.939: INFO/i=(235): 1
08-16 08:08:12.939: ERROR/mainhandle(235): 1
08-16 08:08:13.239: DEBUG/dalvikvm(105): GC freed 2498 objects / 144872 bytes in 81ms
08-16 08:08:17.937: ERROR/thread(235): 1
08-16 08:08:17.940: INFO/child(235): 11111111
08-16 08:08:17.940: INFO/i=(235): 2
08-16 08:08:17.940: ERROR/mainhandle(235): 2
08-16 08:08:22.939: ERROR/thread(235): 2
08-16 08:08:22.939: INFO/child(235): 11111111
08-16 08:08:22.939: INFO/i=(235): 3
08-16 08:08:22.939: ERROR/mainhandle(235): 3
08-16 08:08:27.941: ERROR/thread(235): 3
08-16 08:08:27.941: INFO/child(235): 11111111
08-16 08:08:27.941: INFO/i=(235): 4
08-16 08:08:27.941: ERROR/mainhandle(235): 4
08-16 08:08:32.941: ERROR/thread(235): 4
08-16 08:08:32.941: INFO/child(235): 11111111
08-16 08:08:32.941: INFO/i=(235): 5
08-16 08:08:32.941: ERROR/mainhandle(235): 5
08-16 08:08:37.943: ERROR/thread(235): 5
08-16 08:08:37.943: INFO/child(235): 11111111
08-16 08:08:37.943: INFO/i=(235): 6
08-16 08:08:37.943: ERROR/mainhandle(235): 6
08-16 08:08:42.944: ERROR/thread(235): 6
。。。。。。
以上代码可以看出其执行的顺序。
转自http://www.eoeandroid.com/thread-29406-1-1.html
public class MainActivity extends Activity {
private static final String TAG = "MainThread";
private Timer timer;
private TimerTask timerTask;
private Handler mMainHandle,mChildHandle;
private int i=0;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
timer = new Timer();
timerTask = new MyTimerTask();
mMainHandle = new Handler(){
public void handleMessage(Message msg) {
Log.e("mainhandle", i+"");
}
};
new ChildThread().start();
timer.schedule(timerTask, 0, 5000);
}
public class MyTimerTask extends TimerTask{
public void run() {
if(mChildHandle!=null){
Message childMsg = mChildHandle.obtainMessage();
mChildHandle.sendMessage(childMsg);
Log.e("thread", i+"");
}
}
}
public void onDestroy(){
Log.i(TAG,"stop looping the child threads message queue");
mChildHandle.getLooper().quit();
}
class ChildThread extends Thread{
public void run(){
Looper.prepare();
mChildHandle = new Handler(){
public void handleMessage(Message msg)
{
Log.i("child", "11111111");
i++;
Message toMain = mMainHandle.obtainMessage();
toMain.obj = this.getLooper().getThread().getName()+ i;
mMainHandle.sendMessage(toMain);
Log.i("i=",i+"");
}
};
Looper.loop();
}
}
}
LOG如下:
08-16 08:08:12.936: ERROR/thread(235): 0
08-16 08:08:12.939: INFO/child(235): 11111111
08-16 08:08:12.939: INFO/i=(235): 1
08-16 08:08:12.939: ERROR/mainhandle(235): 1
08-16 08:08:13.239: DEBUG/dalvikvm(105): GC freed 2498 objects / 144872 bytes in 81ms
08-16 08:08:17.937: ERROR/thread(235): 1
08-16 08:08:17.940: INFO/child(235): 11111111
08-16 08:08:17.940: INFO/i=(235): 2
08-16 08:08:17.940: ERROR/mainhandle(235): 2
08-16 08:08:22.939: ERROR/thread(235): 2
08-16 08:08:22.939: INFO/child(235): 11111111
08-16 08:08:22.939: INFO/i=(235): 3
08-16 08:08:22.939: ERROR/mainhandle(235): 3
08-16 08:08:27.941: ERROR/thread(235): 3
08-16 08:08:27.941: INFO/child(235): 11111111
08-16 08:08:27.941: INFO/i=(235): 4
08-16 08:08:27.941: ERROR/mainhandle(235): 4
08-16 08:08:32.941: ERROR/thread(235): 4
08-16 08:08:32.941: INFO/child(235): 11111111
08-16 08:08:32.941: INFO/i=(235): 5
08-16 08:08:32.941: ERROR/mainhandle(235): 5
08-16 08:08:37.943: ERROR/thread(235): 5
08-16 08:08:37.943: INFO/child(235): 11111111
08-16 08:08:37.943: INFO/i=(235): 6
08-16 08:08:37.943: ERROR/mainhandle(235): 6
08-16 08:08:42.944: ERROR/thread(235): 6
。。。。。。
以上代码可以看出其执行的顺序。
转自http://www.eoeandroid.com/thread-29406-1-1.html
更多相关文章
- Android(安卓)ApiDemos 系列解析【View-ImageView/ImageButton】
- textview cannot be resolved to a type 解决方法
- Android中通过Intent调用其他应用的方法
- Android设置GPS及获取经纬度坐标
- Android(安卓)OpenGL ES(五):GLSurfaceView
- android 依赖冲突解决
- [Android]Fragment生命周期
- android 颜色值 代码
- Android系统Home应用程序(Launcher)的启动过程源代码分析