【问题标题】:Exception while Starting an Activity from TimerTask从 TimerTask 启动 Activity 时出现异常
【发布时间】:2011-10-14 02:34:24
【问题描述】:

只有在服务中的一些数据准备就绪后,我才尝试启动一项活动 我正在尝试使用计时器任务来不断地轮询服务以了解数据的可读性

public class SplashTask extends TimerTask {
    @Override
    public void run() {
        Log.i(MY_DEBUG_TAG, "Internet is accessible, Running some Spalsh screen Tasks ");
        if(mBoundService.isDataReady()) {
            Log.e(MY_DEBUG_TAG, "Data is ready in service..");
            startActivityForResult(new Intent(SplashDroid.this, FunWithDataActivity.class), 3);
        } else {
            Log.e(MY_DEBUG_TAG, "Data not ready in service..");
        }
        Log.i(MY_DEBUG_TAG, "Spalsh Tasks fnished..");
    }
}

问题是当数据准备好并且 FunWithDataActivity 即将启动时,我收到以下错误

07-27 14:53:40.614: ERROR/AndroidRuntime(1042): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

【问题讨论】:

    标签: android android-activity timertask


    【解决方案1】:

    startActivityForResult 必须从 UI 线程(不是执行处理程序的线程)调用。为此,请将startActivityForResult 代码移动到Runnable 并在run() 中使用runOnUiThread 运行它。

    【讨论】:

    • 我相信是的。只需将run()中的startActivityForResult调用替换为runOnUiThread(startRunnable)调用,在startRunnable对象的run()中调用startActivityForResult即可。
    • @Mithun P,在您的情况下,您不应该真正使用TimerTask 进行轮询,请使用Handler.postDelayed()。对于 Activity 组件,这是一种更健壮且资源效率更高的方法。
    • @inazaruk 你的意思是'@Mithun P'?
    【解决方案2】:

    您不能在非 UI 线程中使用 startActivityForResult。您可以使用runOnUiThread()Handler.post()

    另外,您不应该真正使用单独的线程进行轮询。使用HandlerpostDelayed() 函数进行轮询。这样你就不会浪费整个线程进行简单的轮询。示例见:Repeat a task with a time delay?

    【讨论】:

      【解决方案3】:

      尝试改用CountDownTimer 类。您还可以查看此答案作为示例:TimerTask in Android?

      【讨论】:

        【解决方案4】:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-07
          • 1970-01-01
          • 2016-02-23
          • 2011-08-30
          • 2013-07-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多