2014-11-22 3 views
0

Я пытаюсь разработать простое приложение для Android, которое контролирует указанный URL-адрес, используя http-клиент, и после того, как определено определенное условие, оно должно выполнять действия уведомления.Медленный андроид, когда он не подключен к зарядному устройству?

У меня есть одно действие, которое запускает отдельный поток и ставит ссылку на него через статическое значение. (Когда активность воссоздана, я использую ссылку для not null для определения, если дочерний поток уже запущен). В этом дочернем потоке у меня есть цикл while, который получает json-данные из url и анализирует его.

Я заметил странное поведение (может быть, потому, что я новичок Android Android). Когда приложение находится на переднем плане, он работает довольно быстро, когда устройство Android переходит в спящий режим, поэтому он часто не выполняет запросы. (может быть, какая-то политика в области энергобезопасности?). Самое странное, что когда я подключил телефон к компьютеру через USB-кабель, он работает быстро (даже если приложение находится в фоновом режиме, а телефон имеет черный экран).

Есть ли какое-либо отношение к активации/дезактивации приложений на основе подключенного зарядного устройства? Я не могу отладить его, потому что как только я подключил кабель, он работает нормально, и я не могу отлаживать, не подключаясь к компьютеру.

ответ

1

Возможно, дело в том, что телефон переходит в спящий режим, когда он останавливает почти все действия и замедляет работу ЦП. Он используется для экономии заряда батареи. Таймеры на Handler.postDelayed(), например, не будут работать правильно (не вовремя). Там особенная концепция этого вопроса - для деятельности, которая должна быть выполнена в спящем режиме, вам нужно использовать AlarmManager см Scheduling Repeating Alarms

Дело в том, что ваше приложение должно зарегистрироваться AlarmManager, а затем его будут получать запланированные события, когда телефон просыпается в спящем режиме. Ваше приложение должно получить блокировку с помощью PowerManager для выполнения действий (в вашем случае это загрузка JSON из сети), которые вы не хотите прерывать спящим режимом во время их выполнения. Рассмотрим следующий пример:

public class AlarmManagerBroadcastReceiver extends BroadcastReceiver { 

    /** 
    * This method is called when we are waking up by AlarmManager 
    */ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
     PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "pulse app"); 
     //Acquire the lock 
     wl.acquire(); 

     //You can do the processing here. 

     //Release the lock 
     wl.release(); 
    } 

    /** 
    * Register our app with AlarmManager to start receiving intents from AlarmManager 
    */ 
    public static void setAlarm(Context context) 
    { 
     int interval = 10; // delay in secs 
     AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
     Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); 
     PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 
     am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval*1000 , pi); 
    } 

    /** 
    * Unregister the app with AlarmManager, call this to stop receiving intents from AlarmManager 
    */ 
    public static void cancelAlarm(Context context) 
    { 
     Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); 
     PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0); 
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     alarmManager.cancel(sender); 
    } 

} 

Этот код необходим android.permission.WAKE_LOCK разрешение в Manifest файл.

Другой пост о AlarmManager использование: Android: How to use AlarmManager

И это: prevent mobile from going into sleep mode when app is running

Статья на первой ссылке говорит, что предпочтительнее использовать Адаптеры синхронизации для этой цели, но я не использовал их самих.

Смежные вопросы