Articles of android handler

Handler.sendMessageDelayed(msg,delay)无法正常工作

我已经定义了一个在加载过程中显示的启animation面。 但根据互联网连接,它只需要600毫秒加载或有时5000毫秒。 所以我定义了启animation面至少显示了3000毫秒,这样用户就不会被浮雕屏幕激怒。 我通过以下方式定义启animation面的开始: private void splashScreen() { setContentView(R.layout.splashscreen); splash = (ImageView) findViewById(R.id.splashscreenLayer); startSplashTime = new Date(); new LoadingThread().start(); } 在LoadingThread中,我检查网络并从Internet加载数据: private class LoadingThread extends Thread { @Override public void run() { checkNetwork(); } } 加载完成后,我将消息发送到MainActivity中定义的处理程序: public void stopSplash() { Message msg = new Message(); msg.what = STOPSPLASH; Date endSplashTime = new Date(); long time […]

找出Looper或HandlerThread中的泄漏问题

我使用了一些处理程序 new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { try{ Messages.onAcknowledgeReceived(); }catch(Exception e){ e.printStackTrace(); } } }); 它每15秒执行一次,有时它开始抛出一些警告 The Looper class instance count has over a limit(100). There should be some leakage of Looper or HandlerThread. 12-16 12:16:11.357: E/Looper(4647): Looper class instance count = 221 12-16 12:16:11.357: E/Looper(4647): Current Thread Name: IntentService[AppService] 12-16 12:16:12.316: […]

后台服务中的Android BLE扫描

我正在尝试制作一款能够扫描某个蓝牙设备作为后台服务的Android应用。 一旦手机在蓝牙设备的特定范围内,通过读取RSSI进行测量,后台服务将启动向用户显示的活动。 如果手机移出蓝牙设备的范围,(在RSSI值超过某个阈值后),应该杀死活动。 以下是后台服务的代码: public class BeaconScanService extends Service implements BluetoothAdapter.LeScanCallback { private Service self = this; public static final String UNLOCK = “unlock”; public static final String STATUS = “status”; public static final String SIGNAL = “signal”; public static final String GET_SIGNAL = “get_signal”; //desired device to find private static final String targetMAC = […]

使用API​​ 19+以较短的间隔更新Widget

Pre API 19,比updatePeriodMillis最短时间30分钟更新Widget的AlarmManager方法是在设置AlarmManager时使用指定的间隔后使用AlarmManager和BroadcastReceiver接收Intent。 目前,使用下面的代码,Widget会更新,但是从Android 5.1开始,使用重复间隔小于60000ms的.setRepeating()会自动将其间隔设置为至少60000ms。 在Widgets onEnabled()中设置警报: AlarmManager am= (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); //After after 3 seconds am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+ 3000, 1000 , pi); 然后在AlarmManagerBroadcastReceiver的onReceive()中: PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, “TAG”); //Acquire the lock wl.acquire(); /* * …… * Update Widgets RemoteViews […]

AudioManager在死线程上向处理程序发送消息?

我正在尝试以编程方式将卷提升到STREAM_MUSIC流的最大值,但是当我这样做时,我正在“向死线程上的处理程序发送消息”问题。 此外,它似乎没有100%的时间提高音量,虽然当我得到这个错误时,它会提高它的大部分时间。 代码是: System.out.println(“Maximum volume for this stream is: “+maxstreamvol+” and it used to be set to: “+currentvol); final AudioManager am = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE); am.setStreamVolume(AudioManager.STREAM_MUSIC, maxstreamvol, AudioManager.FLAG_SHOW_UI); am.setStreamSolo(AudioManager.STREAM_MUSIC, true); System.out.println(“Volume Raised!”); 在谷歌搜索后,似乎这个错误与multithreading情况有关……此时的代码应该在UI线程上运行。 事实上,我甚至把它包围着: runOnUiThread(new Runnable() { public void run() { // code_goes_here } }); 而且,这产生了同样的错误。 我看到的错误是这样的: I/System.out(24949): Maximum volume for this stream is: 15 and it […]

我如何每10秒调用一次function?

我想制作一个应用程序,例如每10秒调用一个函数。 我写了这样的代码: Handler ha=new Handler(); ha.postDelayed(new Runnable() { @Override public void run() { //call function } }, 10000); 但编译此代码后,我的函数在10秒内只调用一次。 我该如何解决?

主线程上的View.postDelayed()和Handler.postDelayed()有什么区别?

根据Handler.postDelayed(Runnable r, long delayMillis)的文档: 使Runnable r添加到消息队列中,在指定的时间量过后运行。 runnable将在连接此处理程序的线程上运行。 另一方面View.postDelayed(Runnable action, long delayMillis) : 导致Runnable被添加到消息队列,在指定的时间量过去后运行。 runnable将在用户界面线程上运行。 我想知道在从主线程调用它们时两者之间是否存在差异,特别是,如果活动被销毁时存在差异? 我已经阅读了这篇文章,关于当我使用内部类Handler时如何泄漏Activity,我想知道使用View.postDelayed()是否会导致同样的问题。 例如,foo()可能导致问题,还是活动的破坏会解决Runnable匿名类持有对活动的引用这一事实? public class MyActiviy extends Activity { private void foo(View v) { v.postDelayed(new Runnable() { public void run() { // some delayed work } }, 60000); finish(); } }

用于重复任务的Android处理程序 – 它会重叠吗? 定时器任务VS处理程序VS警报管理器

我正在尝试构建一个Android应用程序,它将每10分钟重复运行一些进程。 正如我发现Handlers比计时器或计划更可靠。 所以我将使用下面给出的代码使用Handlers开发我的应用Handlers 。 我有点担心以下代码会在每次启动应用Handlers时创建单独的Handlers程序并使它们保持并行运行,可能是因为我在onCreate上创建了Handler 。 那么,一次只保留一个Handler在后台运行的最佳方法是什么? private Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handler = new Handler(); // new handler handler.postDelayed(runnable, 1000*60*10); // 10 mins int. setContentView(R.layout.activity_pro__sms); } private Runnable runnable = new Runnable() { @Override public void run() { /* my set of codes for repeated work */ foobar(); handler.postDelayed(this, […]

Android:如何使用Handler handleMessage并访问对MainActivity的引用

我有一个服务,它从Internet接收命令并启动后台线程。 该线程从服务传递一个处理程序(服务有界并传递处理程序)并向处理程序发送消息以拍照。 我坚持执行处理程序。 static Handler handler = new Handler() { @Override public void handleMessage(Message msg) { //TODO: Handle different types of messages mCamera.takePicture(null, null, MainActivity.this); } }; 问题: Handler需要是静态的吗? 没有静态,我得到“这个Handler类应该是静态的,否则可能会发生泄漏” mCamera需要静态吗? 我被告知要使mCamera静止,但为什么这是必要的? 有没有办法在不使mCamera静态的情况下设置takePicture? 将引用传递给MainActivity的正确方法是什么? 现在我收到错误:“在范围内无法访问MainActivitytypes的封闭实例”

在死线程Google Admob Rewardedvideo上向处理程序发送消息

在完成整个video后,我从Google Admob的奖励video屏幕回到我的活动时得到了这个堆栈跟踪。 它只是警告,而不是崩溃。 观看video后调用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 […]