请教关于安卓中Handler的问题

leetow2006 2018-10-07 03:19:33
我这个程序是抄的,就是按start键就启动子线程,按end键就停止。
请看:
public class MainActivity extends Activity {

Button startButton,endButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

startButton=(Button)findViewById(R.id.startButton);
endButton=(Button)findViewById(R.id.endButton);
startButton.setOnClickListener(new StartButtonClick());
endButton.setOnClickListener(new EndButtonClick());

}

class StartButtonClick implements View.OnClickListener
{
public void onClick(View v)
{
handler.post(rab);
}
}

class EndButtonClick implements View.OnClickListener
{
public void onClick(View v)
{
handler.removeCallbacks(rab);
}
}

Handler handler=new Handler();

Runnable rab=new Runnable()
{
public void run()
{
System.out.println("sub thread");
handler.postDelayed(rab, 3000);
}
};
}

我有几个问题:
1、子线程输出sub thread后,还有3秒空闲,我想:如果此时我想在主线程中也输出一段字符串,
请问该怎么写?主线程函数要写在哪?主线程函数名是什么?
(安卓有没有像java那样有个main函数,如果有可以在那写)
2、handler.postDelayed(rab, 3000)是把子线程对象放入消息队列中,
请问在哪个函数中从消息队列中取消息?怎么没有看到Looper?
...全文
1183 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
追风码农 2018-10-16
  • 打赏
  • 举报
回复
这个程序只会在主线程中执行,没有子线程。3秒的空闲是主线程的,3秒空闲中主线程不能执行任何动作。 下面的代码实现了在子线程中打印sub Thread, 在主线程中打印其他字符串: public class MainActivity extends Activity { Button startButton,endButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new SubThread().start(); startButton=(Button)findViewById(R.id.startButton); endButton=(Button)findViewById(R.id.endButton); startButton.setOnClickListener(new StartButtonClick()); endButton.setOnClickListener(new EndButtonClick()); //在这个地方可以打印字符串 System.out.println("main thread"); } class SubThread extends Thread { public void run() { handler=new Handler(); } } class StartButtonClick implements View.OnClickListener { public void onClick(View v) { if (handler != null) { handler.post(rab); } //在这个地方可以打印字符串 System.out.println("main thread"); } } class EndButtonClick implements View.OnClickListener { public void onClick(View v) { if (handler != null) { handler.post(rab); } //在这个地方可以打印字符串 System.out.println("main thread"); } } Handler handler; Runnable rab=new Runnable() { public void run() { System.out.println("sub thread"); handler.postDelayed(rab, 3000); } }; } 第二个问题:Handler 是从Looper中获取Message, Looper是从MessageQueue队列中获取Message。获取Message的逻辑已经封装在Looper和Handler里面了。
leetow2006 2018-10-15
  • 打赏
  • 举报
回复
HandlerThread怎么跟一个线程挂钩?因为用Thread时,重写里面的run()就是线程运行的内容,可是HandlerThread里面的run()方法已经被安卓实现了。请问如果想把线程与HandlerThread挂钩,怎么做?
weixin_43372822 2018-10-10
  • 打赏
  • 举报
回复
不错啊 这个可以啊,谢谢
leetow2006 2018-10-09
  • 打赏
  • 举报
回复
引用 6 楼 z979451341 的回复:
这个可以实现,但是你不能在主线程里一直循环执行,你需要使用handler发送消息让handler的handleMessage函数里打印,
你需要知道Looper本身就是Android的事件机制的核心,就是因为Looper的不断循环 从MessageQueue里取Message,然后处理Message,应用才能正常运行。对于屏幕刷新和点击事件反馈其实都是通过Looper处理相应Message实现的。

说白了就是弄一个for循环,防止main函数执行完,如果函数执行完,这个程序就停了

那这很象windows程序,windows程序也是一直在取消息,执行消息的响应过程
YXTS122 2018-10-09
  • 打赏
  • 举报
回复
引用 6 楼 键盘舞者113的回复:
这个可以实现,但是你不能在主线程里一直循环执行,你需要使用handler发送消息让handler的handleMessage函数里打印,
你需要知道Looper本身就是Android的事件机制的核心,就是因为Looper的不断循环 从MessageQueue里取Message,然后处理Message,应用才能正常运行。对于屏幕刷新和点击事件反馈其实都是通过Looper处理相应Message实现的。

说白了就是弄一个for循环,防止main函数执行完,如果函数执行完,这个程序就停了
能否把你说的用代码展示岀来呢?谢谢
键盘舞者113 2018-10-08
  • 打赏
  • 举报
回复
引用 2 楼 leetow2006 的回复:
请问:主线程是哪个函数?我想在主线程中写代码,然后是主、子线程轮流运行

在哪个线程不是在哪个函数决定的,在activity里,出了在Runnable里的代码是在子线程,你其他写的代码,如果被执行那就是在主线程。

因为一个程序开启后,主线程就被创建出来,所以没有特殊情况,所有代码的执行都在主线程
usecf 2018-10-08
  • 打赏
  • 举报
回复
android中activity的oncreate方法就类似main方法 android应用启动的时候,首先会执行oncreate方法的
leetow2006 2018-10-08
  • 打赏
  • 举报
回复
请问:主线程是哪个函数?我想在主线程中写代码,然后是主、子线程轮流运行
Non-satisfied 2018-10-08
  • 打赏
  • 举报
回复
上述代码在我看来,是一直在主线程操作,没有什么子线程。如果想建立子线程的handle队列,应该使用HandlerThread 先创建线程,再创建该线程的handle。另外Runnable rab=new Runnable() 这个rab 可以在任意线程,不是调用了就在子线程,要看调用对象。
键盘舞者113 2018-10-08
  • 打赏
  • 举报
回复
这个可以实现,但是你不能在主线程里一直循环执行,你需要使用handler发送消息让handler的handleMessage函数里打印,
你需要知道Looper本身就是Android的事件机制的核心,就是因为Looper的不断循环 从MessageQueue里取Message,然后处理Message,应用才能正常运行。对于屏幕刷新和点击事件反馈其实都是通过Looper处理相应Message实现的。

说白了就是弄一个for循环,防止main函数执行完,如果函数执行完,这个程序就停了
leetow2006 2018-10-08
  • 打赏
  • 举报
回复
请看:
public class test6 {

public static void main(String[] args) {
// TODO 自动生成的方法存根
Thread thread=new Thread(new Prtn2());
thread.start();

while(true)
{
System.out.println("Main thread ");
}

}

}

class Prtn2 implements Runnable
{
public void run()
{
while(true)
{
System.out.println("sub thread ");

}
}
}
这个是java,它运行时,能够输出Main thread和sub thread(应该是按时间片来轮流运行),我想问:能否在安卓中也能实现?
我只能实现的是在子线程中输出sub thread,但是没有办法输出Main thread(不是只输出一次,是象上面那个java一样,输出多次)
键盘舞者113 2018-10-07
  • 打赏
  • 举报
回复
你需要重写handler的 handleMessage函数,在里面写打印代码,然后在Runnable里用handler调用sendMessage函数。
关于取出消息是在Looper的loop函数里完成的,而且主线程默认就有一个Looper,所以你创建的Handler就是通过Looper.myLooper()获取的

handler的使用和源码解析,你可以看看这篇博客 https://blog.csdn.net/z979451341/article/details/66472693,你可以可以在博客留言问问题

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧