【问题标题】:looper.prepare an ui threadlooper.prepare 一个 ui 线程
【发布时间】:2016-09-05 12:56:38
【问题描述】:

我正在尝试使用似乎需要在我的服务中创建处理程序的 SDK。

出现一条错误消息,说如果线程没有调用Looper.prepare(),我无法创建处理程序,所以我调用Looper.prepare(),这个问题就消失了。 但是,这个服务需要在一段时间后启动一个活动,而这个Looper.prepare() 似乎在搞乱它,因为第一个 UI 函数崩溃说它不能从非 UI 线程调用。

我对为什么会发生这种情况有点困惑,而且我对线程和弯针的研究对我没有帮助。我明白了为什么如果线程上不存在 looper 我们不能创建处理程序,但不明白为什么创建 looper 会阻止我之后使用 ui 线程。

下面是我的简化代码:

public class MyService extends Service implement SDKCallback{

...

void callSDK(){

    Looper.prepare();
    SDK.run(); //Does thing I don't know about
}

@Override
SDKCallback(){

    startActivity(new Intent(this, MyActivity.class);

}


}

【问题讨论】:

  • 你能把代码贴出来吗?
  • 刚刚做了,但我不确定它是否有帮助。问题确实来自处理程序之间的交互; looper 和 ui 线程。

标签: android user-interface looper


【解决方案1】:

您不必致电Looper.prepare()。试试这段代码创建Handler

new Handler(Looper.getMainLooper()) {
    @Override
    public void handleMessage(Message message) {

    }
};

如果你把Looper.prepare()放在你的工作线程中,它会解决你的第一个崩溃问题[线程没有调用Looper.prepare()]。但它不在 UI 线程中,所以你不能开始下一个Activity

上面的代码所做的是,它在 UI 线程中创建 Handler。所以你可以开始下一个Activity

编辑:试试这个。

@Override
SDKCallback(){

    new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message message) {
            startActivity(new Intent(MyService.this, MyActivity.class));
        }
    };


}

【讨论】:

  • 我不能。我不是创建 Handler 的人。 SDK 可以,但我无法访问它的代码。有没有办法在不访问它的情况下更改处理程序使用的循环器?
  • 我更新了我的答案。在 SDKCallback 中创建处理程序并尝试。 @Laetan
  • @DineshBob 正确答案,唯一的问题是,这在意图中不起作用,因为这将引用 Handler 类,它应该是 startActivity(new Intent(MyService.this, MyActivity.class);
  • 是的。我从问题中复制了这一行。没注意到。谢谢 :) @varunkr
猜你喜欢
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多