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();
}
}
}
source to share
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.
source to share
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 .
source to share