Почему эта тема блокирует мое приложение для Android?

1

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

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

ОК, тогда я помещаю поток в службу, но я не знаю, почему, если я запускаю службу, поток службы frezzing мой APP: S. он предположил, что когда u использует код сервисов и потоков, выполняется в фоновом режиме и ничего не застывает, но в этом случае происходит frezzing моего приложения. Как избежать этого?

это код моей службы:

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("[email protected]", 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();
    }   
}

}

Теги:
multithreading
service

1 ответ

5
Лучший ответ

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

BTW, onStart устарел. Внесите onStartCommand вместо этого.

  • 0
    я запускаю один поток в onStartCommand, тем не менее мой пользовательский интерфейс блокирует, вы можете помочь в этом?
  • 0
    @Richa Пожалуйста, отправьте новый вопрос SO с вашим примером кода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню