#android #handler #runnable
#Android #обработчик #runnable
Вопрос:
я использую фоновую службу, которая извлекает данные и вставляет их на удаленный сервер. Хорошо, я запустил его в фоновом режиме, потому что хотел выполнить это в фоновом режиме, не замедляя работу моего приложения, но это замедляет работу моего приложения!
как вы увидите в коде, он переходит в режим ожидания на 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 amp;amp; 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:
Даже если вы создали службу, это не означает, что она будет выполняться в отдельном потоке. Взгляните http://developer.android.com/reference/android/app/Service.html
Обратите внимание, что службы, как и другие объекты приложения, выполняются в главном потоке их процесса размещения. Это означает, что, если ваша служба собирается выполнять какие-либо операции, требующие больших затрат процессора (например, воспроизведение MP3) или блокирующие (например, сетевые), она должна создать свой собственный поток, в котором выполнять эту работу. Более подробную информацию об этом можно найти в Processes and Threads. Класс IntentService доступен как стандартная реализация Service, которая имеет свой собственный поток, в котором он планирует выполнение своей работы.
Пожалуйста, найдите время, чтобы прочитать, как службы на самом деле работают в Androidhttp://developer.android.com/guide/topics/fundamentals/services.html
Итак, IntentService
и запланированное оповещение могут быть решением здесь.