- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个需要每分钟与远程服务器同步的应用程序。无法使用推送通知,因为应用程序仅供内部使用,不会在 Google Play 上发布。我发现我可以使用 AlarmManager 和 IntentService 来达到我的目标。因此,我安排每分钟传递一次挂起的 Intent ,并在 IntentService 中处理它以执行网络 I/O。这听起来很简单,但我遇到了以下问题:应用程序在一段时间后(我想大约 100 分钟)失败并出现以下错误。
05-27 06:52:05.845 32176-32732/ru.infotecs.intentservice E/Looper: WARNING: The Looper class instance count has over a limit(100). There should be some leakage of Looper or HandlerThread.
05-27 06:52:05.845 32176-32732/ru.infotecs.intentservice E/Looper: Looper class instance count = 101
05-27 06:52:05.845 32176-32732/ru.infotecs.intentservice E/Looper: Current Thread Name: IntentService[BackgroundService]
我创建了一个非常简单的示例来更仔细地检查问题。所以它看起来像:
Activity :
public class MainActivity extends AppCompatActivity {
private AlarmManager alarmManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
PendingIntent pi = PendingIntent.getService(getBaseContext(), 0, BackgroundService.getIntent(getBaseContext()), PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 0, 500, pi);
}
}
服务:
public class BackgroundService extends IntentService {
private final static String TAG = BackgroundService.class.getSimpleName();
private final static String ACTION_START = "ru.infotecs.intentservice.action.START";
private static volatile int counter = 0;
public BackgroundService() {
super(TAG);
counter = 0;
}
public static Intent getIntent(Context context) {
Intent intent = new Intent(context, BackgroundService.class);
intent.setAction(ACTION_START);
return intent;
}
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
final String action = intent.getAction();
if (ACTION_START.equals(action)) {
counter++;
Log.d(TAG, ACTION_START + " - "+ counter);
}
}
}
}
如您所见,我将时间间隔从 1 分钟减少到 500 毫秒,以更快地重现问题。所以现在大约需要几分钟,但无论如何结果是一样的:
05-27 06:52:04.348 32176-32717/ru.infotecs.intentservice D/BackgroundService: ru.infotecs.intentservice.action.START - 1
05-27 06:52:04.846 32176-32720/ru.infotecs.intentservice D/BackgroundService: ru.infotecs.intentservice.action.START - 1
05-27 06:52:05.349 32176-32726/ru.infotecs.intentservice D/BackgroundService: ru.infotecs.intentservice.action.START - 1
05-27 06:52:05.845 32176-32732/ru.infotecs.intentservice E/Looper: WARNING: The Looper class instance count has over a limit(100). There should be some leakage of Looper or HandlerThread.
05-27 06:52:05.845 32176-32732/ru.infotecs.intentservice E/Looper: Looper class instance count = 101
05-27 06:52:05.845 32176-32732/ru.infotecs.intentservice E/Looper: Current Thread Name: IntentService[BackgroundService]
05-27 06:52:05.845 32176-32732/ru.infotecs.intentservice I/System.out: java.lang.ThreadGroup[name=main,maxPriority=10]
05-27 06:52:05.845 32176-32732/ru.infotecs.intentservice I/System.out: Thread[main,5,main]
05-27 06:52:05.846 32176-32732/ru.infotecs.intentservice I/System.out: Thread[Thread-5,5,main]
05-27 06:52:05.847 32176-32732/ru.infotecs.intentservice I/System.out: Thread[Binder_1,5,main]
05-27 06:52:05.847 32176-32732/ru.infotecs.intentservice I/System.out: Thread[Binder_2,5,main]
05-27 06:52:05.847 32176-32732/ru.infotecs.intentservice I/System.out: Thread[IntentService[BackgroundService],5,main]
05-27 06:52:05.848 32176-32732/ru.infotecs.intentservice W/System.err: java.lang.Throwable: stack dump
05-27 06:52:05.848 32176-32732/ru.infotecs.intentservice W/System.err: at java.lang.Thread.dumpStack(Thread.java:489)
05-27 06:52:05.848 32176-32732/ru.infotecs.intentservice W/System.err: at android.os.Looper.prepare(Looper.java:105)
05-27 06:52:05.849 32176-32732/ru.infotecs.intentservice W/System.err: at android.os.Looper.prepare(Looper.java:86)
05-27 06:52:05.849 32176-32732/ru.infotecs.intentservice W/System.err: at android.os.HandlerThread.run(HandlerThread.java:53)
05-27 06:52:05.850 32176-32732/ru.infotecs.intentservice D/BackgroundService: ru.infotecs.intentservice.action.START - 1
我想知道这种微不足道的应用程序是如何导致错误的。我稍微检查了 IntentService 实现,发现服务在 Intent 处理后自动停止。
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
}
每次服务被销毁时,looper 也会停止:
@Override
public void onDestroy() {
mServiceLooper.quit();
}
所以我完全不知道哪里出了问题。有什么想法吗?
我使用特定设备来运行我的应用程序。它是 RugGear RG500。问题不会在模拟器上重现,因此可能是设备运行时的问题。
附言目前,我通过一些修改将 IntentService 实现应用到我的项目中来解决这个问题。我注释掉了 stopSelf 方法调用,以尽可能保持 Looper/Thread Activity 。它不能完全解决问题,因为 Android 可能会在内存不足的情况下停止服务并在最近重新启动它。
最佳答案
由于我之前没有检查过内存泄漏,所以需要一些时间才能弄清楚到底发生了什么。看起来设备制造商对 Looper 代码进行了一些检测以跟踪分配。它只是打印错误消息并转储调用堆栈,但同时应用程序非常稳定。我认为这是特定于供应商的代码,因为我没有在 Android SDK 的源代码中找到此消息。
如果你打开内存分配监视器,你会看到内存在一段时间内稳定分配,最后释放。这意味着垃圾收集是由 JVM 发起的。分配内存的峰值在连续的时间段内保持不变。它不会像预期的那样随着时间的推移急剧增长。
此外,GC 后错误消息消失。我假设分配计数器只是在检测类的 finalize 方法中重置。
关于android - IntentService 在 Android 4.2 (Jelly Bean) 上有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44372892/
我想满足在 Jelly Bean 版本及以下版本以及 Jelly Bean 以上版本上运行的设备。 我的方法应该根据应用程序 ID 获取所有应用程序的应用程序使用情况/流量。请注意这行 rx = Lo
我正在使用 Maven 3 开发 Jenkins 插件,看到两个默认的 .jelly 文件:global.jelly 和 config.jelly。两者之间有什么区别,您能举例说明每个文件中的内容吗?
我在hudson中使用email-ext-plugin生成报告,查看$HUDSON_ROOM\plugins\email-ext\WEB-INF\classes\hudson\plugins\emai
我有一个简单的问题。在jenkins中,当为gui制作jelly配置文件时,您可以有一个单选按钮展开并显示更多元素,这也可以通过下拉列表来完成吗?如果是这样,有人有例子吗?我知道如何使用单选按钮来完成
我想打印数组中的元素,使用 foreach 循环给出错误 "元素 j:foreach 的前缀 j 未绑定(bind)" . 下面是我写的代码: Jello World var word
我在我的应用程序中集成了通知,我已经处理了 2 个案例:使用 NotificationCompat.Builder 的 Pre Jelly bean 通知,以及使用生成器发布 Jelly bean 通
我正在尝试在我的通知中实现媒体播放器控件。我需要播放/暂停按钮在“播放”可绘制对象和“暂停”可绘制对象之间动态切换(基本上取决于用户的触摸)。例如,一旦用户触摸“暂停”按钮,它需要更改为“播放”。当用
我尝试创建一个向左动画的按钮,然后再次向右返回到正常状态。动画不适用于此代码: .fortnite-wrapper .btn.btn-display:after { content: ""; disp
是否可以在 Jelly 中动态更新文本框的值? 我有一个下拉框,其选项是根据表单中以前的数据确定的。使用在线可用的文档可以轻松实现这一点(只需使用描述符中的 doFill...Items() 方法)。
我正在尝试在装有 Android 4.2.2 的 Nexus 4 中设置飞行模式。我知道这是不可能的,因为 AIRPLANE_MODE_ON 已移至 Global system settings它只是
以下代码不适用于 Jelly Bean (Android 4.1): final ComponentName cn = new ComponentName("com.android.phone","c
我正在使用WebView以便在我的Android应用中播放YouTube视频。 它工作正常,但我似乎对Jelly Bean存有疑问(也许还不知道更高版本)。 第一次播放视频时,它可以正常播放,但是当我
This widget is no longer supported. Other horizontally scrolling widgets include HorizontalScrollVie
文本框 文本区域 但是 clazz="required" 不适用于 textarea,我是否缺少另一个与 clazz req
我正在为我公司的一些自定义报告创建一个构建后插件。我从此处提供的 Jenkins“hello world”示例开始: https://wiki.jenkins-ci.org/display/JENKI
我正在尝试构建一个Jenkins Post构建插件,我必须在其中处理JSON文件(包含测试结果)并以表格格式显示它执行构建后,Jenkins 中的 code> 。 以下是到目前为止已完成的步骤: 创建
自从我的华硕 Transformer 平板电脑升级到 Jelly Bean 后,我发现应用程序和小部件的卸载有时非常缓慢,需要几分钟而不是几秒钟。这可能是有原因的吗? 我在 Stackoverflow
我正在进行一项 Activity ,我必须向用户显示 Toast 消息。操作系统版本是 Jelly Bean,显示通知已打开。这适用于 Ice Cream Sandwich 。这是代码: Toast.
在最新版本 Jelly Bean 之前,我的 android webview 应用程序从未出现过滚动问题。滚动不再足够流畅,也没有加速。有什么想法吗? 最佳答案 我尝试使用硬件加速,但没有解决这个问题
正在关注 my previous notification problems我想测试 Jelly Bean 4.1 中描述的新通知堆栈功能 here .我已经发现,通知需要有不同的 ID,否则旧通知只
我是一名优秀的程序员,十分优秀!