2011-01-22 4 views
1

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

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

ОК, затем я помещаю нить в службу, но я не знаю, почему, если я запускаю службу, поток службы frezzing моего APP: С. это означает, что, когда 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(); 
    } 
} 

}

ответ

5

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

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

+0

Я запускаю один поток в onStartCommand, но мой интерфейс блокирует, вы можете помочь в этом? – Richa

+0

@Richa Пожалуйста, разместите новый вопрос SO с вашим примером кода. –

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