High efficiency Android app

I am programming an application that needs to perform a high cpu operation for a longer time.

the operation is started as a service but the android system kills the application due to high CPU usage

so what can i do to reduce cpu usage? and make the system not stop my service?

:

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


    }
    }
}

      

+3


source to share


2 answers


You can try to split the operation into smaller parts and put it Thread.sleep()

for a short time. If that's not enough, try changing the code in the loop as follows:

Old code:

object.move(1000);

      

New code:



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

      

If the example move()

takes longer, if the given parameter is higher, old code may cause your program to become unresponsive. The new code will allow android to talk to your program on time Thread.sleep()

, so your app doesn't stop working.

@edit As I can see in your code you have multiple loops. Try placing Thread.sleep (10) in them.

+2


source


You put this code directly into the Service, which runs on the main thread. You need to put it on a background thread instead. Use IntentService

or start a worker thread from your service instead .



0


source







All Articles