2011-01-22 61 views
1

即時製作一個Android應用程序,我有一個服務,通過從遠程數據庫下載數據在後臺更新我的本地數據庫。爲什麼這個主題阻止了我的Android APP?

我必須在服務上放一個線程,因爲我不知道爲什麼,當我在服務上使用簡單的句柄風格bucle時,它在更新本地數據庫時在某個秒內凍結了我的應用程序。 (我有我的本地數據庫在MyApplication類上的dbAdapter)

好吧,然後我把一個線程的服務,但我不知道爲什麼,如果我啓動服務,線程的服務是frezzing我的APP: S.它暗示了當你使用服務和線程代碼在後臺執行,並沒有凍結任何東西,但在這種情況下是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通過在主UI線程操作系統調用,這就是爲什麼你被卡在那裏(你阻塞主UI線程在run()中)。而不是this.run();你應該在這裏開始一個新的線程 - new Thread(this).start();

順便說一句,onStart已棄用。改爲執行onStartCommand

+0

我在onStartCommand中運行一個線程,但我的UI仍然阻塞,你能幫忙嗎? – Richa 2016-06-29 09:01:38

相關問題