Android-android为什么在application类里面发送runnable失败?
在派生的Application类里面创建一个加载线程,当数据加载完毕的时候,加载线程往主线程发一个runnable,貌似发送失败了。代码如下:
class MyApp extends Application
{
public void onCreate()
{
LoaderThread t = new LoaderThread();
t.start();
}
private class LoaderThread extends Thread
{
public void run()
{
SystemClock.sleep(2000);
boolean res = m_handler.post(m_runnable);
if(res)
Log.d(TAG, "Posted Runnable");
}
}
private final Handler m_handler = new Handler();
private final Runnable m_runnable = new Runnable() {
public void run()
{
Log.d(TAG, "Hey, i'm runnable!");
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我们知道handler 一般理解成啥,一消息队列的机制处理好一个个的消息,然后给主线自己慢慢处理对吧。 你自己看下Handler 的构造方法,
public Handler(Looper looper) {
mLooper = looper;
mQueue = looper.mQueue;
mCallback = null;
}
/**
* Default constructor associates this handler with the queue for the
* current thread.
*
* If there isn't one, this handler won't be able to receive messages.
*/
public Handler() {
if (FIND_POTENTIAL_LEAKS) {
final Class<? extends Handler> klass = getClass();
if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
(klass.getModifiers() & Modifier.STATIC) == 0) {
Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
klass.getCanonicalName());
}
}
mLooper = Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;
mCallback = null;
}
看到没有,handler 关键的是需要一个looper ,你在avtivity 中new Handler 默认使用的都是主线程的looper , 而你继承了Application ,之后,必须得在配置文件中。
<application
android:name=".MyAppTest"
android:icon="@drawable/icon" android:label="@string/app_name" >
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
在<application>绑定使用,不然两者的Context 不一样,Looper 自然就有问题。
绑定使用必然没有问题,小包亲测//
03-12 14:33:16.154: DEBUG/test(2004): onCreate
03-12 14:33:18.163: DEBUG/test(2004): Hey, i'm runnable!
03-12 14:33:18.163: DEBUG/test(2004): Posted Runnable
可以运行啊
<application
android:name=".MyApp"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
把LoaderThread做简单修改如下:
private class LoaderThread extends Thread
{
@Override
public void run()
{
try {
while(true) {
sleep(2000);
m_handler.post(m_runnable);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d(TAG, "Posted Runnable");
}
}
或者把
m_handler.post(m_runnable);
改成 m_handler.postDelayed(m_runnable, 1000);
试试!