【问题标题】:Substring of the intent extra is being changed when passing it to Service class将意图额外的子字符串传递给服务类时正在更改
【发布时间】:2015-04-24 08:39:39
【问题描述】:

我面临着让我发疯的问题。我希望有人能解释我这种奇怪的行为。所以我想将 JSON 字符串 {"latitude":53.86907815,"longitude":10.66554789,"formatted":"23.04.2015 10:16:49","route":4} 传递给我的服务类“PostData”,但同时我在 onStartCommand() 方法中得到 null 以及 JSON 字符串,其中格式化值始终是旧值而不是我传递给班级的当前时间。

MainActivity内部类中的调用部分:

String jSONString = convertToJSON(pLong, pLat, formatted);
Intent intentJson = new Intent(MainActivity.this, PostData.class);
intentJson.putExtra("json_data", jSONString);
startService(intentJson);

PostData 类:

public class PostData extends IntentService {

    public PostData() {
        super("someone");
        // TODO Auto-generated constructor stub
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub

        return super.onStartCommand(intent, flags, startId);
    }


    @Override
    protected void onHandleIntent(Intent intent) {
        // TODO Auto-generated method stub
        String jSONString = intent.getStringExtra("json_data");
    if(jSONString != null){

        System.out.println("Output from onStartCommand "+jSONString);
    }

    }

}

我也尝试调试它,但是当调试器在 onStartCommand 中时,我总是得到 null 作为输出!!

此屏幕截图是在调试器位于“startService(intentJson);”这一行时捕获的:

这是我在 onStartCommand 方法中得到的一些输出。这里 formatted 始终具有相同的时间戳:23.04.2015 18:37:49 在调试模式中,我总是得到 null 作为输出!!

04-24 11:29:22.785: I/System.out(23721): Output from onStartCommand {"latitude":53.86898202,"longitude":10.66561591,"formatted":"24.04.2015 11:29:23","route":1}
04-24 11:29:22.805: I/System.out(23721): Output from onStartCommand {"latitude":53.86907815,"longitude":10.66554789,"formatted":"23.04.2015 18:37:49","route":4}
04-24 11:29:23.766: I/System.out(23721): Output from onStartCommand {"latitude":53.86898202,"longitude":10.66561589,"formatted":"24.04.2015 11:29:24","route":1}
04-24 11:29:23.806: I/System.out(23721): Output from onStartCommand {"latitude":53.86907815,"longitude":10.66554789,"formatted":"23.04.2015 18:37:49","route":4}
04-24 11:29:24.787: I/System.out(23721): Output from onStartCommand {"latitude":53.868982,"longitude":10.66561591,"formatted":"24.04.2015 11:29:25","route":1}
04-24 11:29:24.807: I/System.out(23721): Output from onStartCommand {"latitude":53.86907815,"longitude":10.66554789,"formatted":"23.04.2015 18:37:49","route":4}
04-24 11:29:25.758: I/System.out(23721): Output from onStartCommand {"latitude":53.868982,"longitude":10.66561591,"formatted":"24.04.2015 11:29:26","route":1}
04-24 11:29:25.818: I/System.out(23721): Output from onStartCommand {"latitude":53.86907815,"longitude":10.66554789,"formatted":"23.04.2015 18:37:49","route":4}
04-24 11:29:26.809: I/System.out(23721): Output from onStartCommand {"latitude":53.86907815,"longitude":10.66554789,"formatted":"23.04.2015 18:37:49","route":4}

【问题讨论】:

  • 你为什么要覆盖 onStartCommand?我不是说它会解决你的问题,但你所需要的只是覆盖 onHandleIntent
  • @pskink:我已经将代码移到了 onHandleIntent() 方法,但我现在得到了一个当前时间24.04.2015 11:21:36 和一个旧时间23.04.2015 18:37:49"
  • 所以你 startService 一次但 onHandleIntent 被调用两次? strrrrrrrrrrange....

标签: android android-intent


【解决方案1】:

错误必须在其他地方。 Intent 和 bundle 工作正常。你可以转发!

您是否多次启动PostData 服务?这可能会引起混乱,因为意图服务就像队列一样工作?它一个接一个地处理一个意图,并在之前的工作完成后从新的意图开始。

此外,您应该在onHandleIntent 中处理意图数据,而不是在onStartCommand 中。 无需覆盖onStartCommand。可能这会导致错误,因为如果IntentService 已经在运行并从队列中获取新的 Intent,我不确定在此处传递哪个 Intent 作为参数。

【讨论】:

  • 是的,我从昨天早上开始多次启动它,我一直坚持它。我想每 60 秒向服务器发送一次数据。如何清理队列以进入最后一个队列?
  • 我认为这不是问题所在。您的应用程序每 60 秒启动一次意图服务,并传递当前数据。那应该没问题。如果数据在 80 秒后上传到您的服务器,真的会有什么不同吗?但是,我认为不支持清除队列。但是,您可以复制 Intent Service 的源代码并按照此处所述实现该功能:stackoverflow.com/questions/7318666/…
  • 但这不是你的问题!尝试只触发一个 Intent 来启动您的服务(而不是每 60 秒)并对其进行调试。我很确定在启动服务的意图中设置数据存在问题。
  • 它是公共汽车跟踪器。我需要时间知道何时记录了数据,因为如果没有互联网连接,则数据应在内部存储中短时间(可能 10 分钟)存储,直到连接可用,否则将其删除。我现在从当前时间11:11:08 和旧时间18:37:49 得到一个输出@
  • 我认为问题在于您覆盖了onStartCommand()。只需将您的代码从onStartCommand 移动到onHandleIntent()。如果意图来自 IntentService 内部队列,我不确定哪个意图作为参数传递给 onStartCommand
【解决方案2】:

您必须在intent中设置值并在启动服务时传递该intent,您可以在service onStartCommand(Intent intent, int flags, int startId)中获取值。

这就是您必须通过意图传递该整数的方式。

private class StartClick implements View.OnClickListener {      
        public void onClick(View v) {
            Intent intent = new Intent(main_activity,ServiceMP3.class);
            intent.putExtras("position",4);
            main_activity.startService(intent);

        }
    }

你可以得到这样的服务价值

public int onStartCommand(Intent intent, int flags, int startId) {
if(intent != null){
   int position = intent.getIntExtra("position", 0);
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 2012-04-10
    • 2012-01-15
    • 1970-01-01
    • 2023-01-16
    相关资源
    最近更新 更多