Android-android为什么在application类里面发送runnable失败?

发布于 2016-10-23 20:22:07 字数 800 浏览 1153 评论 3

在派生的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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

想挽留 2017-07-23 01:37:22

我们知道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

瑾兮 2017-01-19 09:01:02

可以运行啊
<application
android:name=".MyApp"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >

虐人心 2016-11-02 22:58:48

把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);
试试!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文