1

デバイスに3000を超えるSMSがあります。データベース内のすべてのメッセージを読み込もうとしています。私はこのクエリを使用しています:

Cursor cur1 = c.getContentResolver().query(Uri.parse("content://sms/"), null, null, null, null);

cur1.getCount()3000のSMSをすべて返しますが、ループを介して解析すると、400から500までしか実行されません。

Cursor cur1 = c.getContentResolver().query(Uri.parse("content://sms/"), null, null, null, null);
int size = cur1.getCount();

if(size > 0)
{
    sms = new SMS[size];
    //int i = 0;
    for(int i = 0 ; i < size ; i++)
    {
        cur1.moveToNext();
        ContactInfo p = new ContactInfo();
        String content = cur1.getString(cur1.getColumnIndex("body"));
        String number = cur1.getString(cur1.getColumnIndex("address"));
        long date = cur1.getLong(cur1.getColumnIndex("date"));
        String person = cur1.getString(cur1.getColumnIndex("person"));
        String protocol = cur1.getString(cur1.getColumnIndex("protocol"));
        String name = p.getName(number, c);
        String type = null;

        Calendar cal=Calendar.getInstance();
        cal.clear();
        cal.setTimeInMillis(date);

        String date_time=String.format("%1$te %1$tB %1$tY,%1$tI:%1$tM:%1$tS %1$Tp",cal);

        Log.i("INFO", content+" "+i);

        sms[i] = new SMS(type , name , number , date_time , content );
    }
}

400〜500回の反復後、logcatは出力します

09-19 20:28:31.148: E/liblog(3153): failed to call dumpstate
09-19 20:28:31.179: I/ActivityManager(3153): Process com.arslan (pid 1766) has died.
4

1 に答える 1

0

他の多くのプロセスがデバイス上で実行されており、3000メッセージを読み取るこの長いプロセスのために、多くの継続的なCPU時間がかかるため、プロセスが強制終了されます。私がスレッドを通してそれを読み込もうとしたとき、それはうまくいきます。

    final Cursor cur1 = c.getContentResolver().query(Uri.parse("content://sms/"), null, null, null, "date ASC");
    final int size = cur1.getCount();

    final int sleeptimer = size;

    final SMS [] sms = new SMS[size];


    Thread  myThread = new Thread()
    {
        public void run()
        {
            try
            {
                int currentwait = 0;
                int j=0;
                while(currentwait < sleeptimer)
                {
                    sleep(200);
                    currentwait+=200;
                    for(int i = 0 ; i < 200 ; i++)
                    {
                        if(!cur1.moveToNext())
                        {
                            break;
                        }
                        ContactInfo p = new ContactInfo();
                        String content = cur1.getString(cur1.getColumnIndex("body"));
                        String number = cur1.getString(cur1.getColumnIndex("address"));
                        long date = cur1.getLong(cur1.getColumnIndex("date"));
                        String protocol = cur1.getString(cur1.getColumnIndex("protocol"));
                        String name = p.getName(number, c);
                        String type = null;

                        Calendar cal=Calendar.getInstance();
                        cal.clear();
                        cal.setTimeInMillis(date);

                        String date_time=String.format("%1$te %1$tB %1$tY,%1$tI:%1$tM:%1$tS %1$Tp",cal);

                        Log.i("INFO", content+" "+j);

                        sms[j] = new SMS(type , name , number , date_time , content );
                        j++;
                    }
                }
            }
            catch(Exception e)
            {

            }
            finally{

            }
        }
    };
    myThread.start();
于 2012-09-20T07:02:32.750 に答える