私は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();
}
}
}
私はonStartCommandで1つのスレッドを実行していますが、まだ私のUIはブロックしています。これで助けてください。 – Richa
@Richaサンプルコードで新しいSOの質問を投稿してください。 –