在一个新开启的线程中调用“Toast.makeText(Activity01.this, "五秒后关闭", Toast.LENGTH_SHORT).show();”
报Can't create handler inside thread that has not called Looper.prepare()
在新线程中添加“Looper.prepare();”
解决问题。。
但是不明白为什么
没详细看 有时间看看
http://www.android123.com.cn/kaifafaq/420.html
================================
朋友,我重现了你的问题,当我使用java.lang.Thread重现了你这个问题,log也是这个,原因很简单,Dialog的产生是需要Looper的,在Android里面有一种叫做Handler的类,他是专门处理线程的通讯问题的。你可以使用Handler把Thread换掉,这样就可以了,我已经实现了。
<!--End_rbody_67261241//--> |
|
我记得好像有这么一个说法就是,Android中不能在子线程中来刷新UI线程。 所以楼主如果要实现你这功能的话。建议是在你的子线程中添加hander来发送消息更新线程。
<!--End_rbody_67263036//--> |
|
在主activity中定一个Handler的成员,然后实现handlemassage函数,创建线程后在runable的run函数里new一个message,然后指定message对象的what成员,这个是指定message的一个id,然后在run中调用Handler的成员,使用其成员方法中的sendmessage(好像是叫这个),handlemassage函数中参数有个massage,根据该message参数中的what来对你发送message时指定的what来处理UI的功能
<!--End_rbody_67269283//--> |
|
private Handler mHandler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case ID_USER:
//获取传递的数据
//Bundle data = msg.getData();
//int count = data.getInt("COUNT");
//处理UI更新等操作
}
};
};
主activity中创建线程
Java code
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
MyThread thread = new MyThread();
mThread = new Thread(thread);
mThread.start();
MyThread
Java code
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
class MyThread implements Runnable {
public void run() {
//执行数据操作,不涉及到UI
Message msg = new Message();
msg.what = ID_USER;
//这三句可以传递数据
// Bundle data = new Bundle();
// data.putInt("COUNT", 100);//COUNT是标签,handleMessage中使用
// msg.setData(data);
mHandler.sendMessage(msg); // 向Handler发送消息,更新UI
}
<!--End_rbody_67269464//--> |
|
4,5楼已经都说了,没啥好说的了,只是强调除了在onCreat()函数和Handler()函数,其他地方不要操作UI界面元素,线程只是用来下载数据的和其他操作的,操作完成了发送个Message到Handler()函数,然后再里面处理UI
<!--End_rbody_67274095//--> |
跟我之前碰到的一样,解决方法5楼是一种方法,还有一种方法是使用Looper.prepare();配合Looper.loop();来实现。
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
Thread action = new Thread()
{
public void run()
{
Looper.prepare();
todo();
Looper.loop();
}
};
action.start();
android下UI线程是不安全的,因此对于UI的操作,都要放在UI线程中,从另个线程发送消息给UI线程,是个解决方法
|
|
|
|
#2楼 得分:1回复于:2010-07-27 09:56:43
我记得好像有这么一个说法就是,Android中不能在子线程中来刷新UI线程。 所以楼主如果要实现你这功能的话。建议是在你的子线程中添加hander来发送消息更新线程。
<!--End_rbody_67263036//--> |
|
在主activity中定一个Handler的成员,然后实现handlemassage函数,创建线程后在runable的run函数里new一个message,然后指定message对象的what成员,这个是指定message的一个id,然后在run中调用Handler的成员,使用其成员方法中的sendmessage(好像是叫这个),handlemassage函数中参数有个massage,根据该message参数中的what来对你发送message时指定的what来处理UI的功能
<!--End_rbody_67269283//--> |
|
private Handler mHandler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case ID_USER:
//获取传递的数据
//Bundle data = msg.getData();
//int count = data.getInt("COUNT");
//处理UI更新等操作
}
};
};
主activity中创建线程
Java code
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
MyThread thread = new MyThread();
mThread = new Thread(thread);
mThread.start();
MyThread
Java code
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
class MyThread implements Runnable {
public void run() {
//执行数据操作,不涉及到UI
Message msg = new Message();
msg.what = ID_USER;
//这三句可以传递数据
// Bundle data = new Bundle();
// data.putInt("COUNT", 100);//COUNT是标签,handleMessage中使用
// msg.setData(data);
mHandler.sendMessage(msg); // 向Handler发送消息,更新UI
}
<!--End_rbody_67269464//--> |
|
4,5楼已经都说了,没啥好说的了,只是强调除了在onCreat()函数和Handler()函数,其他地方不要操作UI界面元素,线程只是用来下载数据的和其他操作的,操作完成了发送个Message到Handler()函数,然后再里面处理UI
<!--End_rbody_67274095//--> |
跟我之前碰到的一样,解决方法5楼是一种方法,还有一种方法是使用Looper.prepare();配合Looper.loop();来实现。
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
Thread action = new Thread()
{
public void run()
{
Looper.prepare();
todo();
Looper.loop();
}
};
action.start();
android下UI线程是不安全的,因此对于UI的操作,都要放在UI线程中,从另个线程发送消息给UI线程,是个解决方法
|
|
|
分享到:
相关推荐
开一个新线程,引起的异常。1. ANR: application not responding 2.android.view.ViewRoot$...3.java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
在Android开发中,`Looper`、`Looper.prepare()` 和 `Looper.loop()` 是处理线程间通信和异步任务的关键组件。它们与`Message`和`Handler`一起构成了Android的消息传递机制。默认情况下,一个线程并没有内置的消息...
当在非UI线程(子线程)中创建`Handler`时,如果没有调用`Looper.prepare()`,程序将抛出异常:“Can't create handler inside thread that has not called Looper.prepare()”。这是因为`Handler`依赖于`Looper`来...
在创建 Handler 对象时,如果不在主线程中创建,而是在子线程中创建,会导致程序崩溃,提示的错误是 Can't create handler inside thread that has not called Looper.prepare()。这是因为子线程中没有调用 Looper....
当创建一个新的Handler实例时,如果在子线程中没有事先调用Looper.prepare()来初始化Looper,会抛出“Can't create handler inside thread that has not called Looper.prepare()”异常。这是因为Handler需要一个...
"Can't create handler inside thread that has not called Looper.prepare()"); } mQueue = mLooper.mQueue; ... } ``` 3. **Message** Message是消息的载体,用于在Handler和Looper之间传递数据。它包含了...
1. 在创建Handler时,如果当前线程没有Looper,会抛出`java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()`。这说明Handler必须在有Looper的线程中使用,例如...
在Android应用开发中,Handler、Thread和Looper是三个至关重要的组件,它们共同构成了Android线程间通信的基础架构。本文将详细解析这三个概念及其相互关系,旨在帮助开发者理解它们的工作原理和实际应用场景。 ...
本文将深入探讨Android中的三种主要线程模式:Handler、Thread以及Looper,并结合源码分析它们的工作原理。 首先,我们来理解一下Android应用的基本运行环境。Android系统默认在主线程(UI线程)中执行所有的用户...
在 run() 方法中,我们首先调用 Looper.prepare() 方法来创建 Looper 对象,然后创建一个 Handler 对象,并将其与 Looper 对象关联。最后,我们调用 Looper.loop() 方法来处理消息循环。 通过使用 Looper 对象,...
handler.sendMessage(msg); Looper.loop(); // 保持子线程的消息循环 } }).start(); // 使用AsyncTask的例子 class MyTask extends AsyncTask, Integer, String> { @Override protected String doInBackground...
在安卓开发中,`Handler`、`Looper`和`MessageQueue`是三个核心组件,它们共同构成了Android消息处理机制,用于实现线程间的通信。这个压缩包“安卓Android源码——HandlerLooper2.rar”可能包含了关于这些组件的...
这些组件之间的交互过程大致如下:子线程中的Handler通过Looper.prepare()和Looper.loop()建立消息循环,然后使用Message.obtain()创建Message,设置数据和目标Handler,最后通过Handler.sendMessage()将Message放入...
在Android开发中,Handler、Looper和MessageQueue是用于实现线程间通信的关键组件,它们共同构建了一个消息处理机制。理解这三个概念以及它们之间的关系对于优化应用程序的性能和响应性至关重要。 Handler(处理器...
在Android系统中,`Handler`、`Looper`和`MessageQueue`是三个核心组件,它们共同构成了Android消息处理机制,使得应用程序能够实现线程间的通信和异步任务处理。本资料"应用源码之HandlerLooper2.zip"显然是针对这...
`CustomThread` 类继承自 `Thread` 并重写了 `run()` 方法,在 `run()` 中调用了 `Looper.prepare()` 和 `Looper.loop()`,使线程具备了处理消息的能力。`mHandler` 是在主线程中创建的 Handler 实例,它用来发送...
Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理. 简单定义: 1、Message Queue(消息队列): 用来存放通过Handler发布的消息,通常...
3. `Message`的创建和发送:通过`Handler.sendMessage()`或`Handler.sendMessageDelayed()`发送消息,可能还有使用`Message`携带数据的示例。 4. 异步任务的实现:可能包含一个使用`Handler`、`Looper`完成异步任务...
handler.sendMessage(msg); ``` 5. **处理消息**:Handler的`handleMessage()`方法会在消息被分发到对应线程时被调用,此时可以执行相应操作。 在实际应用中,我们通常结合使用Handler和Looper来实现异步处理,...