为什么这个帖子阻止了我的Android APP?

时间:2011-01-22 11:24:22

标签: android multithreading service

我正在制作Android应用程序,我有一项服务,通过从远程数据库下载数据来在后台更新我的本地数据库。

我必须在服务上放一个线程,因为我不知道为什么,当我在服务上使用一个简单的句柄样式bucle它在更新本地数据库的某些秒期间冻结我的应用程序。 (我在MyApplication类的dbAdapter中有我的本地数据库)

好的,然后我在服务上放了一个帖子,但我不知道为什么,如果我启动该服务,该服务的线程是我的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("pablo@upv.es", 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();
    }   
}

}

1 个答案:

答案 0 :(得分:5)

操作系统在主UI线程上调用onStart,这就是你被困在那里的原因(你在run()中阻止主UI线程)。你应该在this.run();开始一个新的主题,而不是new Thread(this).start();

BTW,onStart已被弃用。而是实施onStartCommand