2011-01-22 2 views
1

메신저 안드로이드 앱을 만들고 있는데 원격 DB에서 데이터를 다운로드하여 내 로컬 DB를 백그라운드에서 업데이트하는 서비스가 있습니다.이 스레드가 내 Android APP를 차단하는 이유는 무엇입니까?

로컬 db를 업데이트 할 때 몇 초 동안 내 응용 프로그램이 고정 된 서비스에서 간단한 핸들 스타일 bucle을 사용할 때 이유를 알지 못하기 때문에 서비스에 스레드를 넣어야합니다. (내 로컬 db dbAdapter MyApplication 클래스에있는)

OK, 그럼 서비스에 스레드를 넣어,하지만 난 왜 서비스를 시작하면 서비스의 스레드 내 APP frezzing 이유를 모르겠어요 : 에스. 그것은 u 서비스와 스레드 코드를 사용하면 백그라운드에서 실행되고 아무 것도 얼어 붙지 않는다고 맹세하지만,이 경우에는 내 애플이 얼버무 린다. ¿ 그것을 피하는 방법?

내 서비스 코드 :

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 스레드의 OS에 의해 호출, 즉 당신이 거기에 붙어있어 왜 (메인 UI 스레드를 차단이다 실행()). this.run(); 대신에 여기에 새 스레드를 시작해야합니다 - new Thread(this).start();.

BTW, onStart은 (는) 더 이상 사용되지 않습니다. 대신 onStartCommand을 구현하십시오.

+0

onStartCommand에서 하나의 스레드를 실행 중입니다. 여전히 내 UI가 차단되고 있습니다.이 문제를 해결할 수 있습니까? – Richa

+0

@ 리차버 샘플 코드와 함께 새로운 질문을 게시하십시오. –

관련 문제