Android中Activity和Handler的运行机制

Listening_music Listening_music 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
刚学Android没多久哈,所以好多运行中的机制不是很清楚呢>_<
1、Android中如果创建了一个主Activity,也就是创建了一个主线程,那这个主线程有没有run方法?还有如果在Activity的onCreate方法中给button设置了监听,后面点击按钮出发Click事件,那个onCreate方法并没有再次执行,为什么还是能执行onCreate方法中的onClick方法呢?
2、还在就是如果我在主线程中创建一个Handler并且就是绑定到这个主线程的Looper上的(先不管这个有没有实际意义哈,我知道handler用在线程间消息传递才能看出他的强大哈~),具体情况请看一下下面的代码:
package com.test.handler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;

public class ChildSet extends Activity {
/** Called when the activity is first created. */
private ProgressBar myProgressbar;
private Button myButton;
private OnClickListener listener;
private Runnable childThread;
private static final String TAG = "TAG";
Myhandler mainHandler, childHandler;
private int i = 0;

// private Thread t;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

myProgressbar = (ProgressBar) findViewById(R.id.progressbar_id);
myButton = (Button) findViewById(R.id.button_id);

Log.i(TAG, "Main Thread:" + Thread.currentThread().getName());
// HandlerThread handlerThread = new HandlerThread("child_ron_Thread");
// handlerThread.start();

mainHandler = new Myhandler(Looper.getMainLooper());
// childHandler = new Myhandler(handlerThread.getLooper());// $$$$$$$$$$$$$

myButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (i == 0) {
myProgressbar.setVisibility(ProgressBar.VISIBLE);
mainHandler.post(childThread);
i = i + 1;
}
// myProgressbar.setProgress(80);//这个可以设置的哟~~~
Log.i(TAG, "Click..." + Thread.currentThread().getName());
}
});
childThread = new Runnable() {
int persent = 0;

@Override
public void run() {
// TODO Auto-generated method stub
persent += 5;
Message msg = Message.obtain();
msg.arg1 = persent;
Log.i(TAG, "Runnable Thread:"
+ Thread.currentThread().getName());

// mainHandler.sendMessage(msg);
mainHandler.sendMessage(msg);
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
};
}

// //////////////////////////onCreate////////////////////////////
class Myhandler extends Handler {
public Myhandler(Looper looper) {
super(looper);
}

public void handleMessage(Message msg) {
myProgressbar.setProgress(msg.arg1);
Log.i(TAG, "handleMessage Thread:"
+ Thread.currentThread().getName());
mainHandler.post(childThread);
// 在子线程中处理,主线程中对button的响应很快;如果这边改成主线程处理则对主线程按钮的响应就慢了
if (msg.arg1 >= 100) {
mainHandler.removeCallbacks(childThread);
}
}
}
}

以上代码运行的时候为什么一定是等run方法运行完了,再等handleMessage运行结束才会响应我的button点击事件,如果是抛出消息之后就handleMessage的话,那我在handleMessage里面也抛出线程了,为什么没有就再直接去执行那个线程的run方法,而是可以就去响应之前的button点击事件了呢?这个监听器到底是怎么运行的呢?
可能因为我懂的太少,然后又理解的太浅,所以问的问题可能比较那什么哈,希望大家帮忙解释一下啦~~~
...全文
评论 11
收藏 已收藏
分享
返回顶部
Listening_music
Android 80,489 成员 91,375 内容