0

我认为问题源于同一件事。无论我是从触发的计时器还是从 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(Message) 行:65
IntentService$ServiceHandler(Handler).dispatchMessage (消息)行:99 Looper.loop() 行:137 HandlerThread.run() 行:60

4

2 回答 2

0

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

其次,Service不应该尝试直接操作某些活动的小部件。曾经。

第三,没有人,甚至是活动,都不能从后台线程修改小部件,例如IntentService.

在这一点上,我猜测 aService可能不是适合您的模型,您应该从活动中做一些其他事情(例如,AsyncTask)。

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

  • LocalBroadcastManager, 或者
  • Otto这样的事件总线,或
  • 一个Messenger绑定到一个Handler
  • 等等
于 2013-04-22T18:05:57.473 回答
0

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

public static void TickTockHit() {
    ((Activity)Login.ctx).runOnUiThread(new Runnable()
     {
        public void run()
     {
       Login.ShowForm("");
      }
     });    }
于 2013-04-22T18:55:32.943 回答