Android App高CPU使用率

时间:2012-03-11 15:18:52

标签: android service cpu-usage

我编写的应用程序必须在较长时间内执行高CPU使用率的操作

该操作就像服务一样开始 但由于高CPU使用率,android系统会杀死应用程序

那么我该怎么做才能减少cpu的使用量呢? 并使系统不停止我的服务?

服务:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

import android.app.Service;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.os.IBinder;
import android.provider.ContactsContract;

public class backup_service  extends Service {
    int i;
    int i2;


    @Override
    public void onCreate() {
        try
        {
        FileWriter fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/dialog.db");
        BufferedWriter out = new BufferedWriter(fstream);
        out.write("on");
        //Close the output stream
        out.close();
        backup();
        }
        catch (Exception x)
        {
            stopSelf();
        }
    }

    @Override
    public void onDestroy() {
        util.deleteDir(new File("/data/data/contact.backup.alexander.fuchs/dialog.db"));
        stopSelf();
    }



    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    public void backup()
    {
        util.deleteDir(new File("/data/data/contact.backup.alexander.fuchs/backup/"));
        new File("/data/data/contact.backup.alexander.fuchs/backup/").mkdirs(); 



        // get it 
        ContentResolver cr = getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
                null, null, null, null);


        if (cur.getCount() > 0) {
            i = 0;
            i2 = 0;
        while (cur.moveToNext()) {
             String id = cur.getString(
                        cur.getColumnIndex(ContactsContract.Contacts._ID));
        String name = cur.getString(
                        cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));


        // write
        try
        {
            new File("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)).mkdirs(); 

            FileWriter fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)+"/id.txt");
            BufferedWriter out = new BufferedWriter(fstream);
            out.write(id);
            //Close the output stream
            out.close();


            fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)+"/name.txt");
            out = new BufferedWriter(fstream);
            out.write(name);
            //Close the output stream
            out.close();





        }
        catch (Exception x)
        {

        }
        if (Integer.parseInt(cur.getString(
                cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
             Cursor pCur = cr.query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
            null, 
            ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
            new String[]{id}, null);





        while (pCur.moveToNext()) {

            String number = pCur.getString(
                    pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            try
            {
            new File("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)).mkdirs(); 

            FileWriter fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)+"/number.txt");
            BufferedWriter out = new BufferedWriter(fstream);
            out.write(number);
            //Close the output stream
            out.close();


            }
            catch(Exception x)
            {

            }
            }




    pCur.close();

    Cursor emailCur = cr.query( 
            ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
            null,
            ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
            new String[]{id}, null); 
        while (emailCur.moveToNext()) { 
            // This would allow you get several email addresses
                // if the email addresses were stored in an array
            String email = emailCur.getString(
                          emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
            String emailType = emailCur.getString(
                          emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); 
           try
        {
        new File("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)).mkdirs(); 

            FileWriter fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)+"/email.txt");
            BufferedWriter out = new BufferedWriter(fstream);
            out.write(email);
            //Close the output stream
            out.close();

            fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)+"/email_type.txt");
            out = new BufferedWriter(fstream);
            out.write(emailType);
            //Close the output stream
            out.close();


        }
        catch(Exception x)
        {

        }

        } 
        emailCur.close();

        String noteWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
        String[] noteWhereParams = new String[]{id, 
        ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE}; 
                Cursor noteCur = cr.query(ContactsContract.Data.CONTENT_URI, null, noteWhere, noteWhereParams, null); 
    if (noteCur.moveToFirst()) { 
        String note = noteCur.getString(noteCur.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE));

    // write
            try
            {
                new File("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)).mkdirs(); 

                FileWriter fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)+"/note.txt");
                BufferedWriter out = new BufferedWriter(fstream);
                out.write(note);
                //Close the output stream
                out.close();



            }
            catch (Exception x)
            {

            }
    } 
    noteCur.close();



    String addrWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
    String[] addrWhereParams = new String[]{id, 
        ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE}; 
    Cursor addrCur = cr.query(ContactsContract.Data.CONTENT_URI, 
                null, null, null, null); 
    while(addrCur.moveToNext()) {
        String poBox = addrCur.getString(
                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX));
        String street = addrCur.getString(
                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));
        String city = addrCur.getString(
                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
        String state = addrCur.getString(
                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));
        String postalCode = addrCur.getString(
                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
        String country = addrCur.getString(
                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
        String type = addrCur.getString(
                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE));
    // write
            try
            {
                new File("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)).mkdirs(); 

                FileWriter fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)+"/pobox.txt");
                BufferedWriter out = new BufferedWriter(fstream);
                out.write(poBox);
                //Close the output stream
                out.close();

                fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)+"/street.txt");
                out = new BufferedWriter(fstream);
                out.write(street);
                //Close the output stream
                out.close();

                fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)+"/city.txt");
                out = new BufferedWriter(fstream);
                out.write(city);
                //Close the output stream
                out.close();

                fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)+"/state.txt");
                out = new BufferedWriter(fstream);
                out.write(state);
                //Close the output stream
                out.close();

                fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)+"/postalcode.txt");
                out = new BufferedWriter(fstream);
                out.write(postalCode);
                //Close the output stream
                out.close();

                fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)+"/country.txt");
                out = new BufferedWriter(fstream);
                out.write(country);
                //Close the output stream
                out.close();

                fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)+"addres_type.txt");
                out = new BufferedWriter(fstream);
                out.write(type);
                //Close the output stream
                out.close();

            }
            catch (Exception x)
            {

            }

    } 
    addrCur.close();

    String imWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
    String[] imWhereParams = new String[]{id, 
        ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE}; 
    Cursor imCur = cr.query(ContactsContract.Data.CONTENT_URI, 
            null, imWhere, imWhereParams, null); 
    if (imCur.moveToFirst()) { 
        String imName = imCur.getString(
                 imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA));
        String imType;
        imType = imCur.getString(
                 imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.TYPE));

        //write
       try
        {
        new File("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)).mkdirs(); 

            FileWriter fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)+"/im.txt");
            BufferedWriter out = new BufferedWriter(fstream);
            out.write(imName);
            //Close the output stream
            out.close();

            fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)+"/im_type.txt");
            out = new BufferedWriter(fstream);
            out.write(imType);
            //Close the output stream
            out.close();


        }
        catch(Exception x)
        {

        }

    } 
    imCur.close();


    String orgWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
    String[] orgWhereParams = new String[]{id, 
        ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE}; 
    Cursor orgCur = cr.query(ContactsContract.Data.CONTENT_URI, 
                null, orgWhere, orgWhereParams, null);
    if (orgCur.moveToFirst()) { 
        String orgName = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA));
        String title = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE));
        String company = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.COMPANY));
        String department = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DEPARTMENT));

         //write
       try
        {
        new File("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)).mkdirs(); 

            FileWriter fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)+"/orgName.txt");
            BufferedWriter out = new BufferedWriter(fstream);
            out.write(orgName);
            //Close the output stream
            out.close();

            fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)+"/title.txt");
            out = new BufferedWriter(fstream);
            out.write(title);
            //Close the output stream
            out.close();

            fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)+"/company.txt");
            out = new BufferedWriter(fstream);
            out.write(company);
            //Close the output stream
            out.close();

            fstream = new FileWriter("/data/data/contact.backup.alexander.fuchs/backup/"+String.valueOf(i)+"/department.txt");
            out = new BufferedWriter(fstream);
            out.write(department);
            //Close the output stream
            out.close();

        }
        catch(Exception x)
        {

        }
    } 
    orgCur.close();
        }
        i++;
        }
        onDestroy();


    }
    }
}

2 个答案:

答案 0 :(得分:2)

您可以尝试将操作分成更小的部分并将Thread.sleep()放置一小段时间。如果这还不够,请尝试将一些代码更改为循环,如下所示:

旧代码:

object.move(1000);

新代码:

for (int i=0; i<100; i++) {
    object.move(10);
    Thread.sleep(10);
}

如果给定参数较高,示例move()操作需要更多时间,则旧代码可能导致程序无响应。新代码将允许Android在Thread.sleep()期间与您的程序进行通信,因此您的应用程序不会停止工作。

@edit 正如我在你的代码中看到的那样 - 你确实有几个while循环。尝试将Thread.sleep(10)放在其中。

答案 1 :(得分:0)

您将此代码直接放在主线程上运行的服务中。你需要把它放在后台线程中。请考虑使用IntentService或从服务中启动工作线程。