Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何避免内容提供程序阻塞执行的主(UI)线程_Android_Performance_Android Contentprovider_Calllog - Fatal编程技术网

Android 如何避免内容提供程序阻塞执行的主(UI)线程

Android 如何避免内容提供程序阻塞执行的主(UI)线程,android,performance,android-contentprovider,calllog,Android,Performance,Android Contentprovider,Calllog,在我的应用程序中,我使用getContentResolver()访问呼叫日志和文本消息,这意味着我正在使用android内容提供商。getContentResolver()正在后台服务中运行。一切正常,但我的主要挑战是:每当我启动服务运行提取呼叫日志和文本消息的代码时,内容提供商就会阻止我的主线程执行。我试图将这些代码放在不同的执行线程中,但没有任何变化 我真的需要帮助;我怎样才能避免呢?因为应用程序在具有较小RAM和处理器的设备上不断发出ANR(应用程序无响应)消息 如果您需要我显示代码,我准

在我的应用程序中,我使用
getContentResolver()
访问呼叫日志和文本消息,这意味着我正在使用
android内容提供商
getContentResolver()
正在后台服务中运行。一切正常,但我的主要挑战是:每当我启动服务运行提取呼叫日志和文本消息的代码时,内容提供商就会阻止我的主线程执行。我试图将这些代码放在不同的执行线程中,但没有任何变化

我真的需要帮助;我怎样才能避免呢?因为应用程序在具有较小RAM和处理器的设备上不断发出ANR(应用程序无响应)消息

如果您需要我显示代码,我准备粘贴,如果真的需要

更新:(后台服务中的代码)


您是否可以使用在后台运行任务的代码更新您的问题,以及如何使用
ContentProvider
getContentResolver()正在后台服务中运行???你到底是什么意思?请详细说明并显示代码。
内容提供商阻止我执行主线程。
我不这么认为。如果不在线程中执行,则使用getContentResolver()的代码会阻止它。@sagar阅读用代码更新的我的问题
public void calls\u fromPhone()
Aha。。。公众?您是否使用
新的
操作员启动此服务器?不要那样做。使用意图。您不应该从服务外部调用该函数。使其
private void calls\u fromPhone()
并从
onStart命令调用它。
public class Getting_Call_log_Service extends Service {

//variables of getting call logs
private String ph_number;
private String temp_name;
private String real_name;
private String call_type;
private String dir;
private String call_date;
private String call_duration;
private Date call_day_time;
private SQLite_database_helper_class myDb;

public  class callsThread implements Runnable{
    callsThread(){}

    @Override
    public void run() {

            myDb=new SQLite_database_helper_class(getApplicationContext());
            //codes of extracting call logs
            Cursor cursor = getContentResolver().query(CallLog.Calls.CONTENT_URI,
                    null,null,null,null);

            int number=cursor.getColumnIndex(CallLog.Calls.NUMBER);//to get the index of phoneNumber column
            int name = cursor.getColumnIndex(CallLog.Calls.CACHED_NAME);//to get the index of contact name column
            int type = cursor.getColumnIndex(CallLog.Calls.TYPE);//to get the call type index
            int callDate = cursor.getColumnIndex(CallLog.Calls.DATE);//to get the date of calling
            int callDuration = cursor.getColumnIndex(CallLog.Calls.DURATION);//to get the duration of calling


            cursor.moveToFirst();

                do {

                    //extracting values from phone history
                    ph_number=cursor.getString(number);
                    temp_name=cursor.getString(name);
                    if (temp_name==null){
                        real_name="Annonymous caller!";
                    }else {
                        real_name=temp_name;
                    }
                    call_type=cursor.getString(type);
                    int dir_code=Integer.parseInt(call_type);
                    switch (dir_code) {
                        case CallLog.Calls.INCOMING_TYPE:
                            dir = "INCOMING CALL";
                            break;
                        case CallLog.Calls.OUTGOING_TYPE:
                            dir = "OUTGOING CALL";
                            break;

                        case CallLog.Calls.MISSED_TYPE:
                            dir = "MISSED CALL";
                            break;
                        case CallLog.Calls.REJECTED_TYPE:
                            dir = "REJECTED CALL";
                            break;
                        case CallLog.Calls.ANSWERED_EXTERNALLY_TYPE:
                            dir = "ANSWERED EXTERNALLY";
                            break;
                        case CallLog.Calls.BLOCKED_TYPE:
                            dir = "BLOCKED NUMBER";
                            break;
                        case CallLog.Calls.VOICEMAIL_TYPE:
                            dir = "VOICEMAIL";
                            break;
                    }
                    call_date=cursor.getString(callDate);
                    call_day_time=new Date(Long.valueOf(call_date));

                    call_duration=cursor.getString(callDuration);
                    //end of extraction

                            myDb.saving_call_logs(ph_number,real_name,dir,
                                    call_day_time.toString(), call_duration);
                }while (cursor.moveToNext());
                cursor.close();

        }
    }

public void calls_fromPhone(){

    Thread callThread=new Thread(new callsThread());
    callThread.start();

}


private void call_retriever(){

        TelephonyManager telephonyManager=(TelephonyManager)getSystemService(
                Context.TELEPHONY_SERVICE);

        PhoneStateListener phoneStateListener=new PhoneStateListener(){

            @Override
            public void onCallStateChanged(int state,String inComingNumber){
                if (state==TelephonyManager.CALL_STATE_IDLE){
                    //do stuff here

                    calls_fromPhone();
}

};
  telephonyManager.listen(phoneStateListener,
PhoneStateListener.LISTEN_CALL_STATE);
    }
@Override
public int onStartCommand(Intent intent,int flags, int startId){

    call_retriever();
return START_STICKY;
}