0

受信トレイから最初の100件のSMSを読み取り、ローカルデータベースに保存しています。私はAsyncTaskの助けを借りてこれを行っています。その後、ローカルデータベースからそれらのSMSを読み取り、表示します。最初の100個のSMSを読み取って保存した後のAysncTaskのonPostExecuteで、残りのSMSを読み取ってローカルデータベースに保存するサービスを呼び出しています。サービスを呼び出す前まで、UIは応答していましたが、サービスを呼び出した後、UIは応答しなくなりました。データベースのロックなどが原因ですか。この問題の解決にご協力ください...

私の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);
    }
}

サービスコード

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();
    }
}
4

1 に答える 1

0

サービスは UI スレッドでも実行されています。IntentService でない限り、手動でワーカー スレッドを作成する必要があります。

于 2012-04-20T08:34:23.713 に答える