2011-01-22 5 views
1

私はAndroidアプリを作っています。リモートDBからデータをダウンロードすることで、ローカルDBをバックグラウンドで更新するサービスがあります。なぜこのスレッドは私のAndroid APPをブロックしていますか?

サービスでスレッドを置く必要がある理由はわかりません。サービスで単純なハンドルスタイルのbucleを使用すると、ローカルデータベースを更新している間にアプリがフリーズすることがあります。 (私はMyApplicationクラスのdbAdapterでローカルデータベースを持っています)

OK、サービスにスレッドを入れても、私がサービスを開始した場合、なぜサービスのスレッドが自分のAPPをフリーズしているのかわかりません。 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("[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スレッド上のOSによって呼び出されます実行()中)。 this.run();の代わりに、ここに新しいスレッド - new Thread(this).start();を開始する必要があります。

BTW、onStartは推奨されていません。代わりにonStartCommandを実装してください。

+0

私はonStartCommandで1つのスレッドを実行していますが、まだ私のUIはブロックしています。これで助けてください。 – Richa

+0

@Richaサンプルコードで新しいSOの質問を投稿してください。 –

関連する問題