gpt4 book ai didi

Android:从服务获取结果

转载 作者:行者123 更新时间:2023-11-30 04:02:35 24 4
gpt4 key购买 nike

我有 android 服务,我需要在它启动后返回一个结果。所以:

1)我启动服务

2) 服务做某事

3) 服务返回结果

我想也许我可以使用单例类来获取结果。我创建了一个单例类,以使服务将结果保存在其中,然后通过 Activity 从服务中获取结果。这是类的代码:

public class Result {

//SIGLETON DECLARATION

private static Result mInstance = null;

public static Result getInstance() {
if (mInstance == null) {
mInstance = new Result();
}
return mInstance;
}

private Result() {
}

//CODE

Object result;
boolean resultIsSet = false;

public void deletePreviousResult() {
this.result = null;
resultIsSet = false;
}

public void setResult(Object result) {
Log.w("result", "setResult");
this.result = result;
resultIsSet = true;
}

public Object getResult() {
Log.w("result", "getResult");
while(resultIsSet == false) {}
return this.result;
}

这是我用来获取结果的代码:

public int getInfo() {
Result.getInstance().deletePreviousResult();
//start the service and ask to save the result in singleton class
Intent myIntent = new Intent(mInstanceContext, MediaPlayerService.class);
myIntent.setAction("getInfo");
mInstanceContext.startService(myIntent);
//take the result
return (Integer) Result.getInstance().getResult();
}

onStartCommand 中的作用是:

 Result.getInstance().setResult(mMediaPlayer.getCurrentPosition()); 

其中 mMediaPlayer 是一个 MediaPlayer 对象。

但是问题是,如果 setResult 也应该在 onStartCommand 中调用,它永远不会被调用!为什么?是我的做法不对吗?

最佳答案

您在 getInfo() 中的这段代码:

mInstanceContext.startService(myIntent);
//take the result
return (Integer) Result.getInstance().getResult();

假设当您调用 startService() 时,服务已启动并且 onStartCommand()同步调用,以便在下一个语句中您可以使用 Result.getInstance().getResult() 获取结果。

不幸的是,它不是那样工作的。调用 startService() 与调用对象的方法不同。当您调用 startService() 时,您所做的是告诉 Android 您希望该服务在下一个可用时刻启动。由于您的服务中的onStartCommand()需要在主线程上调用,通常这意味着Android会在下次启动您的服务时调用onStartCommand()获得主线程的控制权(即:当您的所有 Activity 方法都已返回时)。在任何情况下,您都无法确定服务何时启动或 onStartCommand() 何时被调用。这是一个异步调用,因此您需要依赖回调机制。这意味着您需要编写某种回调方法,以便服务在完成工作并希望将结果返回给您时调用。

有多种方法可以做到这一点。您可以让服务向您的 Activity 发送 Intent。您可以让服务广播带有结果的 Intent。您可以绑定(bind)到该服务并注册一个回调监听器(请参阅绑定(bind)服务的开发人员文档)。可能还有其他方法。

关于Android:从服务获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12267349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com