Почему этот обработчик (запускаемый) замедляет мое приложение, если оно запускается в службе? - PullRequest
0 голосов
/ 02 июня 2011

Я использую фоновый сервис, который извлекает данные и вставляет данные на удаленный сервер. Хорошо, я поставил его на фоновый сервис, потому что хотел сделать это в фоновом режиме, не замедляя мое приложение, но это замедляет мое приложение!

как вы увидите в коде, он спит 60 секунд, а мое приложение зависает на 2/3 секунды каждые 60 секунд, я уверен, что это код, но я не знаю, как его решить

public class MyService extends Service implements Runnable{
    boolean serviceStopped;
    RemoteConnection con; //conexion remota
    List <Position> positions;
static SharedPreferences settings;
static SharedPreferences.Editor configEditor;
    private Handler mHandler;
    private Runnable updateRunnable = new Runnable() {
        @Override public void run() {
            //contenido
            if (serviceStopped==false)
            {
                positions=con.RetrievePositions(settings.getString("login","")); //traigo todas las posiciones
                if (positions.size()>=10) //si hay 10 borro la mas vieja
                    con.deletePosition(positions.get(0).getIdposition());
                if (settings.getString("mylatitude", null)!=null && settings.getString("mylongitude", null)!=null)
                    con.insertPosition(settings.getString("mylatitude", null),settings.getString("mylongitude", null), formatDate(new Date()), settings.getString("login",""));
            }
            queueRunnable();//duerme
        }
    };
    private void queueRunnable() {
        //mHandler.postDelayed(updateRunnable, 60000); //envia una posicion al servidor cada minuto (60.000 milisegundos es un minuto)
        mHandler.postDelayed(updateRunnable, 60000);
    }

    public void onCreate() {
        serviceStopped=false;
settings = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
        configEditor = settings.edit();
        positions=new ArrayList<Position>();
        con = new RemoteConnection();
            mHandler = new Handler();
            queueRunnable();
        }

1 Ответ

2 голосов
/ 02 июня 2011

Даже если вы создали сервис, это не значит, что он будет работать в отдельном потоке. Взгляните http://developer.android.com/reference/android/app/Service.html

Обратите внимание, что службы, как и другие объекты приложений, работают в главном потоке процесса их размещения . Это означает, что, если ваша служба будет выполнять какие-либо операции с интенсивным использованием ЦП (например, воспроизведение MP3) или блокировать (например, сетевые), она должна создать свой собственный поток, в котором будет выполняться эта работа. Более подробную информацию об этом можно найти в разделе «Процессы и потоки». Класс IntentService доступен как стандартная реализация Service, имеющая собственный поток, в котором он планирует свою работу.

Пожалуйста, уделите некоторое время, чтобы прочитать, как на самом деле работают сервисы в Android http://developer.android.com/guide/topics/fundamentals/services.html

Итак, IntentService и запланированное оповещение могут быть решением здесь.

...