- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我们发现一个问题,我们的一个 Intent 服务意外地为我们的一些用户检索了一个 null
字符串。我们无法重现此问题,也不知道它在受影响用户的设备上是随机的还是一致的。受影响的用户与设备类型或 Android 版本之间似乎没有关联。
我正在扩展 IntentService
并实现 handleIntent
方法,如下所示:
@Override
public void handleIntent(Intent intent) {
String action = intent.getAction();
if (action.Equals(ACTION_MARK_UNREAD)) {
String messageKey = intent.getStringExtra(EXTRA_MESSAGE_KEY);
// messageKey is null for some users
}
}
带字段:
public static final String ACTION_MARK_UNREAD = "com.myapp.action.MARK_UNREAD";
public static final String EXTRA_MESSAGE_KEY = "extraMessageKey";
在 fragment 中,我们快速连续启动此服务 6 次:
for (int i = 0; i < 6; i++) {
Intent i = new Intent(MyIntentService.ACTION_MARK_UNREAD);
i = i.setClass(mContext, MyIntentService.class);
i.putExtra(MyIntentService.EXTRA_MESSAGE_KEY, i.toString());
mContext.startService(i);
}
为什么服务会为 messageKey
extra 检索 null
的任何想法?
我们在应用程序的其他区域启动了相同的服务,当这种情况发生时,我们无法确定它来自哪个区域。但是,从日志来看,它似乎来 self 提到的这个 fragment 。日志显示 null
发生时的客户端时间戳比上一次发生后几秒。这可能是因为服务队列移动缓慢,或者我的假设可能是错误的。
最佳答案
我的第一个猜测是许多其他人评论过的编译器问题,我在您的示例中发现了一些其他错误,例如 Equals
with upper E。
但仅以您的代码为例,我对这种方法进行了很多测试,我得出的第一件事是无论您的调用是在 Fragment
还是 Activity
由于 Fragment
的 Context
与父级 Activity
相同。
阅读 IntentService
文档我们可以读到:
All requests are handled on a single worker thread -- they may take as long as necessary (and will not block the application's main loop), but only one request will be processed at a time.
此处:http://developer.android.com/reference/android/app/IntentService.html
因此我们可以得出结论,您所有的 X 请求都将被一个接一个地处理。
Android 文档中关于 IntentService 的另一部分我们可以读到:
Because most started services don't need to handle multiple requests simultaneously (which can actually be a dangerous multi-threading scenario), it's probably best if you implement your service using the IntentService class.
此处:http://developer.android.com/guide/components/services.html#ExtendingIntentService
根据这些信息,您可以考虑 IntentService
是否是您需要的方法。对吧?
在这里您可以了解如何仅扩展一个服务
:http://developer.android.com/guide/components/services.html#ExtendingService
完成,下面我将粘贴我为测试您的方法而编写的代码。
主 Activity
类 MainActivity
。
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
for (int i = 0; i < 10; i++) {
Intent intent = new Intent(MyIntentService.MY_ACTION);
intent.setClass(this, MyIntentService.class);
intent.putExtra(MyIntentService.EXTRA, UUID.randomUUID().toString());
startService(intent);
}
}
}
IntentService
MyIntentService
。
public class MyIntentService extends IntentService {
public static final String MY_ACTION = "my.app.namespace.action.myaction";
public static final String EXTRA = "my_extra";
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
String action = intent.getAction();
if (action.equals(MY_ACTION)) {
String messageKey = intent.getStringExtra(EXTRA);
Log.i(EXTRA, messageKey);
}
}
}
并输出Log
。
my_extra﹕ b6faeb0a-29fa-442b-b87e-9c7a5f8c35d7
my_extra﹕ 88076250-d455-4084-af5f-c560ba6d5570
my_extra﹕ 21339466-25ab-4aaa-aadd-344555c4c2df
my_extra﹕ 2f935a93-465b-4648-a3cc-60f0c9cc67a4
my_extra﹕ 128653d1-d6af-499f-8725-78158e2e7190
my_extra﹕ e453ae7b-e21a-41fe-bf9c-f45ccfd13edf
my_extra﹕ 2e3fc6aa-e425-41dd-a584-8ab056fb906d
my_extra﹕ a8d90d53-c6cd-4d15-84f9-4064d6972de9
my_extra﹕ 721dd17b-b977-4029-ada3-5999f0eb36e7
my_extra﹕ e83d3277-adc8-47a8-a246-6cd7f6f2735d
关于android - 快速连续多次启动 Intent 服务会导致额外的空值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21541703/
如果我想为收藏创建一个 Intent 。 如果用户问“他最喜欢什么”,它会显示一些建议芯片 因此它会调用与该芯片相关的任何后续 Intent 。 最喜欢的饮料 最喜欢的食物 最喜欢的电影等 我还想直接
我确信有一些显而易见的事情,但还没有找到解决这个简单问题的方法。错误是在用户猜出正确答案时尝试启动另一个 Activity 的主要 Activity : Error:(85, 23) Unresolv
public class MainActivity extends Activity { Button b; //FrameLayout fl; @Override p
我对 intentService 有点困惑。文档说,如果您向 intentService 发送多个任务( Intent ),那么它将在一个单独的线程上一个接一个地执行它们。我的问题是 - 是否可以同时
我正在尝试从其他应用程序获取 mime 类型 text/plain 的 Intent 并将该文本存储在字符串类型的变量中。它在 onCreate 方法中工作正常,但是当我使用 singleTask 作
我想知道,2个代码有什么区别? newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
如何设置我的 Activity 以响应任何类型的共享 Intent 。 我试过:- 但是这不起作用,我已经阅读了http://developer.android.co
鉴于子类具有不同的上下文以及在单击监听器后启动的不同 Activity ,父类(super class)中的代码 Intent Intent=new Intent(context,Activity.c
更新#1:更多信息添加到这篇文章的末尾 我是 Android 开发和测试的新手。 我有 3 个 Espresso 测试。第一个测试通过,但第二个不会运行,因为在第二个测试之前调用 setUp() 方法
我是 Espresso UI 测试的新手。 我在运行测试时遇到这个错误(ADT Eclipse IDE)。 该应用程序已经开发完成,并且在启动该应用程序时有很多请求正在进行。无法重写应用程序。但我需要
因此,尝试创建一个我认为是基本简历应用程序的应用程序。我有两个类(class),都有同样的问题。它说它“无法解析符号 Intent ” 谷歌部分做了,但没有任何意义.. 这是我的代码。 MainAct
我正在尝试将 user_id 值从一个 Intent 传递到另一个 Intent。我知道这是一个非常简单的过程,而且我已经这样做了好几次了。但对于下面的代码,我有点困惑。 我需要将 user_id 值
这是我将值传递给名为 choice 的类的主要 Activity 。 @Override public void onClick(View v) { // TODO Auto-generated me
我正在寻找一个 Android Intent 来翻译文本,我发现了这个: Google Translate Activity not working anymore 但我想在任务管理器中使用它。我真的
可以设置多个启动 Intent ,例如,当用户点击通知时。 让我解释一下我的具体问题: 我有一个带通知的应用程序。每个通知都会打开一个不同的 Activity (也有不同的附加功能)。 现在我想提取有
我有一个 Intent launchIntent = packageManagerForListener.getLaunchIntentForPackage(packagesForAdapter[po
List targetedShareIntents = new ArrayList(); Intent shareIntent = new Intent(android.content.Intent.
所以我试图在选择列表中的项目后启动一个新 Activity ......根据我所读的内容非常基本。我也在尝试在附加功能中发送一个值。所以我可以选择列表中的项目,然后新 Activity 开始,extr
有没有一种方法可以将一个Intent bundle 从一个 Intent 传递到另一个 Intent ,而不必提取包并单独处理每个额外的 Intent ? 例子: intent2.setExtras(
这个问题在这里已经有了答案: Android 5.0 (L) Service Intent must be explicit in Google analytics (11 个答案) 关闭 6 个月
我是一名优秀的程序员,十分优秀!