我认为问题源于同一件事。无论我是从一个被解雇的计时器还是一个doWakefulWork调用这个子,我都会崩溃......
TextView Past = (TextView) ((Activity) ctx).findViewById(R.id.past);
Past.setText(Html.fromHtml(dMsg));
在我的代码中,我甚至确保用户将该活动激活,以便我不仅仅是显示活动。在我的doWakefulwork中,我正在抓取一些html结果,并根据检索到的数据,我想显示一个特定的活动。当我获得Past的值时它不会崩溃。当我尝试setText
为什么我遇到这个麻烦...
这是使用WAKEFUL时的错误
线程[< 15> IntentService [PageP]](暂停(异常ViewRootImpl $ CalledFromWrongThreadException))
WakeWork(WakefulIntentService).onHandleIntent(Intent)行:112
IntentService $ ServiceHandler.handleMessage(消息)行:65
IntentService $ ServiceHandler(Handler).dispatchMessage(Message)行:99
Looper.loop()行:137
HandlerThread.run()行:60
答案 0 :(得分:0)
首先,这不是一个完整的堆栈跟踪。那就是Eclipse捕获异常。请在Eclipse中运行异常点,然后使用LogCat获取完整的堆栈跟踪。
其次,Service
不应该试图直接操纵某些活动的小部件。如初。
第三,没有人,甚至不是活动,都可以从后台线程修改小部件,例如IntentService
使用的小部件。
此时,我猜测Service
可能不是适合您的模型,您应该从活动中做其他事情(例如,AsyncTask
)。
如果您确信Service
是正确的解决方案,那么您需要让Service
向活动(或相关片段)发送有关数据更改的消息,使用:
LocalBroadcastManager
或Messenger
绑定到Handler
答案 1 :(得分:0)
答案#1非常正确。如果您正在使用SERVICE并且该服务正在使用计时器或WakefulIntentService,则这些服务可以在不同的线程上运行。最重要的是,一个与您的UI(用户界面)线程不同的线程。必须在UI线程上对任何活动进行任何修改。一旦我将以下代码添加到我的计时器中,我就能够成功处理我的活动更改。
public static void TickTockHit() {
((Activity)Login.ctx).runOnUiThread(new Runnable()
{
public void run()
{
Login.ShowForm("");
}
}); }