我正在编写一个不断轮询设备传感器的应用程序,并且经常会将一些统计信息记录到文件中.这可能是每秒一次或每分钟一次慢.我应该使用Handler's postDelayed()方法还是只安排它AlarmManager?
我有一个主要的活动和约束服务.绑定服务从网络接收命令,该命令触发将消息发送到主活动中的处理程序.通过传递Handler对服务的引用,我得到了一切.然后......我偶然发现了一个叫做Messenger的东西.
Messenger:引用Handler,其他人可以使用它向其发送消息.这允许跨进程实现基于消息的通信,方法是在一个进程中创建指向Handler的Messenger,并将该Messenger交给另一个进程.
这引发了一些问题:
在完成整个视频后,我从Google Admob的奖励视频屏幕回到我的活动时得到了这个堆栈跟踪.它只是警告,而不是崩溃.
onRewardedVideoAdClosed()观看视频后调用方法,但onRewarded()不调用.任何帮助?
Handler (android.os.Handler) {5451758} sending message to a Handler on a dead thread
06-06 09:29:00.378: W/MessageQueue(10743): java.lang.IllegalStateException: Handler (android.os.Handler) {5451758} sending message to a Handler on a dead thread
06-06 09:29:00.378: W/MessageQueue(10743): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:543)
06-06 09:29:00.378: W/MessageQueue(10743): at android.os.Handler.enqueueMessage(Handler.java:631)
06-06 09:29:00.378: W/MessageQueue(10743): at android.os.Handler.sendMessageAtTime(Handler.java:600)
06-06 09:29:00.378: W/MessageQueue(10743): at android.os.Handler.sendMessageDelayed(Handler.java:570)
06-06 09:29:00.378: W/MessageQueue(10743): at android.os.Handler.sendEmptyMessageDelayed(Handler.java:534)
06-06 09:29:00.378: W/MessageQueue(10743): at android.os.Handler.sendEmptyMessage(Handler.java:519)
06-06 09:29:00.378: W/MessageQueue(10743): at jm.c(:com.google.android.gms.DynamiteModulesA:2142)
06-06 09:29:00.378: W/MessageQueue(10743): at ahf.f(:com.google.android.gms.DynamiteModulesA:638)
06-06 09:29:00.378: W/MessageQueue(10743): at avj.b(:com.google.android.gms.DynamiteModulesA:1343)
06-06 …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的应用程序中创建一个Handler线程,但Android Studio将我的文本标记为红色,并且只会尝试导入处理程序的java.util版本而不是Android SDK版本.当尝试手动导入时,我能够很好地找到HandlerThread但是正常的处理程序导入似乎缺失了.
有什么想法吗?
我想制作一个应用程序,例如每隔10秒调用一个函数.
我写了这样的代码:
Handler ha=new Handler();
ha.postDelayed(new Runnable() {
@Override
public void run() {
//call function
}
}, 10000);
Run Code Online (Sandbox Code Playgroud)
但是编译完这段代码后,我的函数在10秒内调用了一次.
我该如何解决?
我想实现一个标记动画,如GIF动画.我有两个应该同时闪烁的图像.我发现在android中没有任何可以实现这一点的东西.我想做的是,创建一个每1秒运行一次的处理程序,我正在尝试为标记设置图标.但它不起作用.请指导我正确的方向.
我现在的代码如下.
Handler handler = new Handler();
Boolean marker_color_bool = true;
//adding marker and sending the marker instance to marker_animation() method where handler is called.
MarkerOptions marker = new MarkerOptions()
.title(delivery_center_name)
.snippet("This is the " + delivery_center_name + " location")
.position(location)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.red_marker));
google_map.addMarker(marker);
marker_animation(marker);
Run Code Online (Sandbox Code Playgroud)
marker_animation()方法
private final int ONE_SECONDS = 1000;
public void marker_animation(final MarkerOptions marker ) {
handler.postDelayed(new Runnable() {
public void run() {
Log.e("running",""+marker_color_bool);
if(marker_color_bool == true)
{
marker.icon(BitmapDescriptorFactory.fromResource(R.drawable.green_marker));
marker_color_bool = false;
}
else
{
marker.icon(BitmapDescriptorFactory.fromResource(R.drawable.red_marker));
marker_color_bool = …Run Code Online (Sandbox Code Playgroud) android google-maps google-maps-markers android-handler google-maps-android-api-2
我知道这是多次被问到的问题.然而,有些东西我从来没有找到答案.所以希望有人能给我一些启示.
我们都知道AsyncTask和Thread是执行后台任务以避免ANR问题的选项.建议asynctask只应用于短期运行任务,而线程可用于长时间运行的任务.asynctask不应该用于长任务的原因众所周知,这是因为asynctask可能导致泄漏,因为它可能会在活动被破坏后继续运行.这是令人信服的.但是,它还会导致一些其他问题:
谢谢
multithreading android android-asynctask android-handler rx-java
我的应用程序由一个单独组成Activity.在这个活动中,我正在创建多个HandlerThreads,它们在循环中运行以执行套接字阻塞操作.
目前我HandlerThread在我的期间向这些人发布了一条戒烟信息Activity.onDestroy().
有时,当我打开我的应用程序,关闭它并重新启动它时,它会崩溃(很多时候是由于向未运行的处理程序线程发送消息).
我的问题是:关闭我的应用程序时关闭的正确方法HandlerThread是什么?(请注意,那些线程可能在套接字操作上阻塞).
编辑:更多信息: 我有一个处理程序线程池,它是在onCreate中启动的(当我第一次启动我的应用程序时没问题).
每个处理程序runnable循环都包含一个
if (shouldRun) {
//body
}
else {
close();
}
Run Code Online (Sandbox Code Playgroud)
声明.
close方法删除所有挂起的消息和runnables,并向处理程序发送一条消息,使其调用它looper.quit().这样,如果当前处理程序线程被IO操作阻止,只有一旦它完成它,他将退出().
从UI线程运行异步任务然后修改UI是android开发中的常见问题,因此我决定花一些时间,研究并使用不同的技术,找到最适合我的方法.
我认为重要的因素是:
Activity或者Fragment应该保持尽可能多的线程管理以下是关于各种方法的印象摘要(可能有些错误,有些只是意见):
当我第一次跳入Android时,我AsyncTask没有使用简单LoaderManager:
AsyncTaskManager一个用活动生命周期来管理它们.这似乎是推荐的方法,所以我研究了一下:
Fragment生命周期中的任务,并且从我的理解基本上只是在必要时重新启动任务.在活动重新启动后重新启动活动之前,它似乎无法接收启动任务的结果.Parcelable或Serialiazable进入Bundle对象.这是我确定的方法:
所以,我来到了,使用的结论Handler,Threads和Messages是一个更好的解决办法,但我相信,我失去了一些东西,因为几乎到处都看着我的建议是使用AsyncTaskLoader方法.我错过了什么?
感谢您的投入.
multithreading android android-ui android-asynctask android-handler
有时我们需要在代码运行之前延迟它.
这是可以通过Handler.postDelayed(Runnable)或CountdownTimer.
哪一个在性能方面更好?
请参阅下面的示例代码
处理器
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//DO SOMETHING
}
}, 1000);
Run Code Online (Sandbox Code Playgroud)
倒计时器
new CountDownTimer(1000, 1000) {
public void onFinish() {
//DO SOMETHING
}
public void onTick(long millisUntilFinished) {}
}.start();
Run Code Online (Sandbox Code Playgroud) android ×10
android-handler ×10
admob ×1
alarmmanager ×1
android-ui ×1
google-maps ×1
import ×1
performance ×1
rx-java ×1