package mars.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.widget.Toast;public class HandlerTest2 extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//打印了当前线程的ID
System.out.println("Activity-->" + Thread.currentThread().getId());
//生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能,这个类由Android应用程序框架提供
HandlerThread handlerThread = new HandlerThread("handler_thread");
//在使用HandlerThread的getLooper()方法之前,必须先调用该类的start();
handlerThread.start();
MyHandler myHandler = new MyHandler(handlerThread.getLooper());
Message msg = myHandler.obtainMessage();
//将msg发送到目标对象,所谓的目标对象,就是生成该msg对象的handler对象
Bundle b = new Bundle();
b.putInt("age", 20);
b.putString("name", "Jhon");
msg.setData(b);
msg.sendToTarget();
Toast.makeText(HandlerTest2.this,"在主线程中运行", 1000).show();
}
class MyHandler extends Handler{
public MyHandler(){
}
public MyHandler(Looper looper){
super(looper);
}
@Override
public void handleMessage(Message msg) {
Bundle b = msg.getData();
int age = b.getInt("age");
String name = b.getString("name");
System.out.println("age is " + age + ", name is" + name);
System.out.println("Handler--->" + Thread.currentThread().getId());
System.out.println("handlerMessage");
Toast.makeText(HandlerTest2.this,"在分线程中运行", 3000).show();
}
}
}
不是说Toast中只用在主线程中才能执行么?为啥这里的Toast在分线程中也能执行呢?
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.widget.Toast;public class HandlerTest2 extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//打印了当前线程的ID
System.out.println("Activity-->" + Thread.currentThread().getId());
//生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能,这个类由Android应用程序框架提供
HandlerThread handlerThread = new HandlerThread("handler_thread");
//在使用HandlerThread的getLooper()方法之前,必须先调用该类的start();
handlerThread.start();
MyHandler myHandler = new MyHandler(handlerThread.getLooper());
Message msg = myHandler.obtainMessage();
//将msg发送到目标对象,所谓的目标对象,就是生成该msg对象的handler对象
Bundle b = new Bundle();
b.putInt("age", 20);
b.putString("name", "Jhon");
msg.setData(b);
msg.sendToTarget();
Toast.makeText(HandlerTest2.this,"在主线程中运行", 1000).show();
}
class MyHandler extends Handler{
public MyHandler(){
}
public MyHandler(Looper looper){
super(looper);
}
@Override
public void handleMessage(Message msg) {
Bundle b = msg.getData();
int age = b.getInt("age");
String name = b.getString("name");
System.out.println("age is " + age + ", name is" + name);
System.out.println("Handler--->" + Thread.currentThread().getId());
System.out.println("handlerMessage");
Toast.makeText(HandlerTest2.this,"在分线程中运行", 3000).show();
}
}
}
不是说Toast中只用在主线程中才能执行么?为啥这里的Toast在分线程中也能执行呢?
解决方案 »
- 为什么animationDrawable.start();不能在onCreate 里执行
- 关于安卓开发工具的问题
- android gallery应用
- 如何获取手机的重力感应数据
- android 平台接收不到udp广播包!
- PC与android通讯,pc做client端,哪位朋友能提供一下思路?
- Robotium多用例自动化测试,卡在第二个用例,不能运行
- 求推荐移动开发基础平台
- Android 开发环境 我搭建老失败
- Map<String,list<CourseInfo>>里的CourseInfo什么意思
- 打包出现conversion to dalvik format failed with error 1
- 安卓,bug!!Welcome to debug...
HandlerThread handlerThread = new HandlerThread("handler_thread");handlerThread.start();开的分线程。
同步任务 handler 中的复写的方法都是主线程调用的.通过分线程 发送消息 通知主线程收到消息,然后调用handleMessage方法.希望对你有所帮助
MyHandler myHandler = new MyHandler(handlerThread.getLooper());
的时候知名了其消息栈。# "不是说Toast中只用在主线程中才能执行么?" 有这样的说法么?
你可以尝试在onCreate里面写这样的代码:
for(int i=0;i<1000;i++){
Toast.makeText(HandlerTest2.this,"在分线程中运行", 3000).show();
}
finish();
return;
你会发现你的app退出了很久之后,toast还在不断刷, 我觉得toast是系统单独管理的一个东西,和当前线程不一定有啥关系。 (感觉而已,未经测试)
对啊,这个意思我明白。这个时候“handler attach到他的thread上去”,所有handler就在分线程中了呢,就应该不能Toast,可在上面的handlemessage()函数中为啥还能实现Toast方法呢?
我也是这意思,System.out.println("Activity-->" + Thread.currentThread().getId());System.out.println("Handler--->" + Thread.currentThread().getId())
这俩的输出就不一样啊???
首先楼主的Toast是在handlerThread线程中运行的,这点毫无疑问。现在问题的关键是
Toast是否能在非UI线程中运行,作了个测试代码如下:
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Looper.prepare();
try{
Toast.makeText(MyAndroidActivity.this, "test!", 3000).show();
}catch (Exception e) {
// TODO: handle exception}
}
});
thread.start();如果不加Looper.prepare(); 会抛RuntimeException:Can't create
handler inside thread that has not called Looper.prepare(),说明:
Toast中使用了Handler机制,由于android只能在UI线程中更新UI,所以
猜想Toast最终是通过Handler在UI线程中更新的,具体原理还不太清楚。
建议楼主把HandlerThread的代码贴出来,一起分析下
建议去看看Handler中的代码,
mLooper = Looper.myLooper();
我说的抽象点吧! 希望你能理解
系统的更新 在android中分为逻辑更新,和ui更新
我们的单机事件 等等监听 都是逻辑更新方法
android系统调用完逻辑更新方法后,会自动调用ui更新方法
自己的子线程,更新完逻辑后,并不会通知系统更新ui.
handler机制可以.
handler连的handleMessage执行后,会执行ui更新方法.逻辑更新后面紧跟着ui更新方法.我们只能在 android已经写死了的ui更新前面 加上逻辑更新.例如 单击事件 后面 会有ui更新. 我们在单击事件里面作用一切有关ui的操作都会更新.
handler机制同样如此.如果在你自己的线程中更新了逻辑, 底层在绘制绘制画面的时候,会验证当前的画面和数据是否还是一致.
不一致会抛出异常.逻辑更新和画面更新 在android系统中是按照顺序成对出现的. 只能在规定的地方执行逻辑更新.
否则就异常.handler的确不是ui主线程.但是运行完后,会通知ui线程画面更新. 你可以理解为主线程.我只能说到这里.在不懂,就没办法了
我想实现一个功能:开通socket,接受从某节点连续传入的内容(文字类的)。接收下来后,在函数的内部,对内容的相似度进行比较,当然也要统计该节点的所传输的流量变化。流量的变化的计算方法:d{g(t)}={g(t)-g(t-τ)}/τ,其中g(t)是该节点当前时刻的流量,g(t-τ)前τ时刻的流量。相似度的比较:sim=|e-e'|, 其中e是当前时刻所接收的内容,e'是前一时刻接收的内容。
这里就有问题:1 我该怎么统计前后流量的变化呢?
2 又该怎么实现内容的相互减的操作呢,文字怎么能够相减呢,又不是数字?
希望大侠帮个忙呢,呵呵!!!!