我正在制作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();
}
}
}
答案 0 :(得分:5)
操作系统在主UI线程上调用onStart
,这就是你被困在那里的原因(你在run()中阻止主UI线程)。你应该在this.run();
开始一个新的主题,而不是new Thread(this).start();
。
BTW,onStart
已被弃用。而是实施onStartCommand
。