尝试设置/使用活动时,计时器或doWakefulWork会崩溃

时间:2013-04-22 17:35:35

标签: android android-intent android-activity timer

我认为问题源于同一件事。无论我是从一个被解雇的计时器还是一个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

2 个答案:

答案 0 :(得分:0)

首先,这不是一个完整的堆栈跟踪。那就是Eclipse捕获异常。请在Eclipse中运行异常点,然后使用LogCat获取完整的堆栈跟踪。

其次,Service不应该试图直接操纵某些活动的小部件。如初。

第三,没有人,甚至不是活动,都可以从后台线程修改小部件,例如IntentService使用的小部件。

此时,我猜测Service可能不是适合您的模型,您应该从活动中做其他事情(例如,AsyncTask)。

如果您确信Service是正确的解决方案,那么您需要让Service向活动(或相关片段)发送有关数据更改的消息,使用:

  • LocalBroadcastManager
  • Otto
  • 这样的事件总线
  • Messenger绑定到Handler

答案 1 :(得分:0)

答案#1非常正确。如果您正在使用SERVICE并且该服务正在使用计时器或WakefulIntentService,则这些服务可以在不同的线程上运行。最重要的是,一个与您的UI(用户界面)线程不同的线程。必须在UI线程上对任何活动进行任何修改。一旦我将以下代码添加到我的计时器中,我就能够成功处理我的活动更改。

public static void TickTockHit() {
    ((Activity)Login.ctx).runOnUiThread(new Runnable()
     {
        public void run()
     {
       Login.ShowForm("");
      }
     });    }