2011-01-22 27 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

相关问题