Android 从活动、异步和服务访问SQLite
我正在从收件箱中读取前100条短信,并将其存储在本地数据库中。我是在AsyncTask的帮助下完成这项任务的。之后,我从本地数据库中读取这些短信并显示出来。在读取并存储前100条短消息后的onPostExecute中,我调用服务读取剩余的短消息并将其存储在本地数据库中。在调用服务之前,UI是有响应的,但在调用服务之后,UI变得没有响应。是由于数据库锁定还是其他原因。请帮助解决这个问题 我的异步任务代码Android 从活动、异步和服务访问SQLite,android,sqlite,android-asynctask,android-service,Android,Sqlite,Android Asynctask,Android Service,我正在从收件箱中读取前100条短信,并将其存储在本地数据库中。我是在AsyncTask的帮助下完成这项任务的。之后,我从本地数据库中读取这些短信并显示出来。在读取并存储前100条短消息后的onPostExecute中,我调用服务读取剩余的短消息并将其存储在本地数据库中。在调用服务之前,UI是有响应的,但在调用服务之后,UI变得没有响应。是由于数据库锁定还是其他原因。请帮助解决这个问题 我的异步任务代码 private class InitialSetup extends AsyncTask<
private class InitialSetup extends AsyncTask<String, Integer, Long> {
@Override
protected Long doInBackground(String... urls) {
fetchSMS();
updateDatabase();
return 0L;
}
@Override
protected void onPostExecute(Long result) {
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
populateUI(getApplicationContext());
Intent intent = new Intent(getApplicationContext(), SMSService.class);
getApplication().startService(intent);
}
}
私有类InitialSetup扩展了异步任务{
@凌驾
受保护的长doInBackground(字符串…URL){
fetchSMS();
updateDatabase();
返回0升;
}
@凌驾
受保护的void onPostExecute(长结果){
if(this.dialog.isShowing()){
this.dialog.disclose();
}
populateUI(getApplicationContext());
Intent Intent=新的Intent(getApplicationContext(),SMSService.class);
getApplication().startService(意图);
}
}
服务代码
public class SMSService extends Service {
Long inboxSMSID, localSMSID;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onStart(Intent intent, int startid) {
if (intent.hasExtra("InboxSMS") && intent.hasExtra("SMSID")) {
inboxSMSID = intent.getLongExtra("InboxSMS", 0);
localSMSID = intent.getLongExtra("SMSID", 0);
globalToLocalSMSDB(inboxSMSID);
}
}
private void globalToLocalSMSDB(Long id) {
SMSTable smsObj = new SMSTable(getApplicationContext());
smsObj.open();
Uri uriSMSURI = Uri.parse("content://sms/inbox");
Cursor smscur = getContentResolver().query(uriSMSURI, null,
"_id < " + id, null, "_id DESC");
while (smscur.moveToNext()) {
String sender = SMSManagement.getSender(smscur);
String message = SMSManagement.getMessage(smscur);
String timeStamp = SMSManagement.getTime(smscur);
smsObj.insertIntoSMSTable(sender, message, timeStamp);
}
smscur.close();
smsObj.close();
}
}
公共类SMSService扩展服务{
长inboxSMSID,localSMSID;
@凌驾
公共IBinder onBind(意图arg0){
返回null;
}
@凌驾
公共无效启动(Intent Intent,int startid){
if(intent.hasExtra(“InboxSMS”)&intent.hasExtra(“SMSID”)){
inboxSMSID=intent.getLongExtra(“InboxSMS”,0);
localSMSID=intent.getLongExtra(“SMSID”,0);
globalToLocalSMSDB(inboxSMSID);
}
}
专用void globaltolocalsMSSDB(长id){
SMSTable smsObj=新SMSTable(getApplicationContext());
smsObj.open();
Uri Uri=Uri.parse(“content://sms/inbox");
游标smscur=getContentResolver().query(URI,null,
“_id<”+id,空,“_iddesc”);
while(smscur.moveToNext()){
String sender=smsmsmanagement.getSender(smscur);
String message=smsmsmanagement.getMessage(smscur);
字符串timeStamp=smsmsmanagement.getTime(smscur);
smsObj.insertintosmtable(发送方、消息、时间戳);
}
smscur.close();
smsObj.close();
}
}
该服务也在UI线程中运行,您必须在那里手动创建工作线程,除非它是IntentService。这取决于您在服务中所做的工作。将其代码粘贴到您是否正在创建SQLiteOpenHelper的多个实例?试着使用单例模式-或者自己同步,或者在db上启用线程安全。看看为什么你不能从asyntask访问剩余的sms,为什么你需要服务。。。如果您正在使用,请释放数据连接和内容解析程序,并在服务中重新创建它,或者在应用程序运行时向我显示您的日志unresponsive@VipinSahu我也尝试过使用异步。它仍然是最重要的same@Jens你能进一步解释一下吗?。您还可以给我任何链接,显示我在doInBackground()中尝试调用的SQLite(如果可能的话,多个表)中使用的singleton模式,但UI再次变得无响应。。。不管你如何调用一个服务,新的线程必须在它里面创建(即在onStartCommand中)。嘿,没有你的服务代码,很难判断真正的问题是什么。。。但是,如果您面临数据锁定问题,那么当您启动服务时,该链接必须尝试调试代码,并且您的服务正在启动,或者可能存在上下文问题……您显然是在UI线程中运行所有代码。您需要在服务中显式启动一个线程,或者使用IMO完全适合您需要的IntentService。