Почему эта тема блокирует мое приложение для Android? - PullRequest
1 голос
/ 22 января 2011

Я создаю приложение для Android, у меня есть служба, которая обновляет мою локальную БД в фоновом режиме, загружая данные из удаленной БД.

Мне нужно добавить поток в сервис, потому что я не знаю, почему, когда я использую простой стиль стиля дескриптора в сервисе, он замораживает мое приложение на несколько секунд, когда оно обновляет локальную базу данных. (у меня есть локальная база данных в dbAdapter в классе MyApplication)

ОК, тогда я ставлю поток на сервис, но я не знаю, почему, если я запускаю сервис, поток сервиса замирает в моем приложении: S. Предполагается, что когда вы используете сервисы и потоки, код выполняется в фоновом режиме и ничего не замораживается, но в этом случае это мешает моему приложению. ¿Как этого избежать?

это код моего сервиса:

public class MyServiceLocalDB extends Service implements Runnable{

RemoteConnection con; //conexion remota
//para almacenar la config local de mi app
static SharedPreferences settings;
static SharedPreferences.Editor configEditor;
boolean serviceStopped;

private static MyDbAdapter         mDb;

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {

    serviceStopped=false;
    settings = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
    configEditor = settings.edit();
    con = new RemoteConnection(); 
    mDb = new MyDbAdapter(this);
    mDb.open();
}

@Override
public void onDestroy() {
    //player.stop();
    serviceStopped=true;
}

@Override
public void onStart(Intent intent, int startid) {
    //player.start();
    this.run();
}
public void updateDB()
{  

    mDb.clearDB();
    List<Friend> myFriends=con.RetrieveFriends(settings.getString("login",""));
    List<Permission> myPermissions=con.RetrievePermissions(settings.getString("login",""));

    Permission p1 = null;
    for (int i=0;i<myFriends.size();i++)
    {
        mDb.createUser(myFriends.get(i).getEmail(),myFriends.get(i).getFullName(),myFriends.get(i).getMovilephone(),myFriends.get(i).getMovileOperatingSystem(),myFriends.get(i).getPermission());
        //p1=con.RetrievePermissionWithUser("pablo@upv.es", myFriends.get(i).getEmail());
    }
    for (int i=0;i<myPermissions.size();i++)
    {
        p1=myPermissions.get(i);
        String hour1=formatHourFromTime(p1.getHour1());
        String hour2=formatHourFromTime(p1.getHour2());
        mDb.createPermission(p1.getFk_email1(),p1.getFk_email2(),""+p1.getValidated(),hour1,hour2,p1.getDate1Formated(),p1.getDate2Formated(),""+p1.getWeekend(),p1.getFk_type());
        p1=null;
    }

    //MyApplication.getDatabaseAdapter().clearDB();
    MyApplication.setDatabaseAdapter(mDb);

}

public String formatHourFromTime(Time time)
{
    String hour1;
    if (time.getHours()<10)
        hour1="0"+time.getHours();
    else
        hour1=""+time.getHours();
    if (time.getMinutes()<10)
        hour1=hour1+":0"+time.getMinutes()+":00";
    else 
        hour1=hour1+":"+time.getMinutes()+":00";
    return hour1;
}


public void run() {
    while (serviceStopped==false) 
    {
        //handler.sendEmptyMessage(0);
        try {
           Thread.sleep(25000);// sleeps
        } catch (InterruptedException e) {}
        updateDB();
    }   
}

}

1 Ответ

5 голосов
/ 22 января 2011

onStart вызывается ОС в основном потоке пользовательского интерфейса, поэтому вы застряли там (вы блокируете основной поток пользовательского интерфейса в run ()). Вместо this.run(); вы должны начать новую тему здесь - new Thread(this).start();.

Кстати, onStart устарело. Реализуйте onStartCommand вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...