2011-05-26 46 views
1

我目前正在研究一款短信應用程序,它與股票短信應用程序非常相似。Android - 如何使一個活動加載更快?

但問題是我的應用程序加載比股票(內置)應用程序慢得多。

這裏是我的應用程序的代碼: -

public class ThreadData extends ListActivity 
{ 
private static final Uri SMS_URI = Uri.parse("content://sms"); 
ArrayList<String> bodies = new ArrayList<String>(); 
MySMSAdapter adapter; 
String name; 

public void onCreate(Bundle bundle) 
{ 
    super.onCreate(bundle); 
    setContentView(R.layout.threadlist); 
    Bundle extras = getIntent().getExtras(); 
    if(extras != null) 
    { 
     name = extras.getString("address"); 
    } 
    Cursor cursor = getContentResolver().query(SMS_URI, null, null, null, "date ASC"); 
    startManagingCursor(cursor); 
    while (cursor.moveToNext()) 
    { 
     String Id = cursor.getString(cursor.getColumnIndex("_id")); 
     String address = cursor.getString(cursor.getColumnIndex("address")); 
     String body = cursor.getString(cursor.getColumnIndexOrThrow("body")); 
     String personName = getPersonName(Id, address); 
     if(personName.equals(name)) 
     { 
      bodies.add(body); 
     } 
    } 
    //adapter = new MySMSAdapter(this, bodies); 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.sms_inbox, R.id.row, bodies); 
    ListView listView = getListView(); 
    listView.setAdapter(adapter); 
} 
public String getPersonName(String id, String address) 
{ 
     if(id==null) 
     { 
      if(address != null) 
      { 
       return PhoneNumberUtils.formatNumber(address); 
      } 
      else 
      { 
       return null; 
      } 
     } 

     Cursor c = this.getContentResolver().query(Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, address), 
        new String[] { ContactsContract.PhoneLookup.DISPLAY_NAME }, null, null, null); 

     if(c != null) 
     { 
      try 
      { 
       if(c.getCount() > 0) 
       { 
        c.moveToFirst(); 
        return c.getString(0); 
       } 
      } 
      finally 
      { 
       c.close(); 
      } 
     } 
     if(address != null) 
     { 
      return PhoneNumberUtils.formatNumber(address); 
     } 
     return null; 
} 

} 

我的自定義適配器: -

public class MySMSAdapter extends BaseAdapter 
{ 
private Activity activity; 
private ArrayList<String> data; 
LayoutInflater inflater; 

public MySMSAdapter(Activity a, ArrayList<String> arrayList) 
{ 
    activity = a; 
    data = arrayList; 
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

public int getCount() 
{ 
    return data.size(); //To change body of implemented methods use File | Settings | File Templates. 
} 

public Object getItem(int i) 
{ 
    return data.get(i); //To change body of implemented methods use File | Settings | File Templates. 
} 

public long getItemId(int i) 
{ 
    return i; 
} 

public static class ViewHolder 
{ 
    public TextView textView; 
} 

public View getView(final int i, View view, ViewGroup viewGroup) 
{ 
    View row = view; 
    final ViewHolder holder; 
    if(view==null) 
    { 
     row = inflater.inflate(R.layout.sms_inbox, viewGroup, false); 
     holder = new ViewHolder(); 
     holder.textView = (TextView)row.findViewById(R.id.row); 
     row.setTag(holder); 
    } 
    else 
    { 
     holder = (ViewHolder)row.getTag(); 
    } 

    holder.textView.setText(data.get(i)); 
    return row; 
} 
} 

在我的課堂我試圖加載與這兩個選項(自定義適配器以及ArrayAdapter)名單,但在這兩種情況下我的應用程序加載非常緩慢。如何加載速度更快?我可能更喜歡我的自定義適配器的解決方案,因爲將來我可能需要添加一些東西來添加我的佈局,如照片和其他東西。

謝謝。請幫忙!!

+1

在AsyncTask中加載數據 – pawelzieba 2011-05-26 09:26:11

回答

3

您可以使用http://developer.android.com/guide/developing/tools/traceview.html事件探查器本地化性能問題。我猜測問題是你正在做磁盤操作(Cursor cursor = getContentResolver()。query(...))同步。嘗試使用AssyncTask來完成這個assync,例如

+0

請問您能解釋一下我應該在AsyncTask中放置哪部分代碼,因爲我嘗試了它,但是它花費了相同的時間,但唯一的區別是該消息一次一個地加載而不是全部加載。請多解釋一下。 :( – Varundroid 2011-05-27 04:38:14

+0

這部分 光標光標= getContentResolver()的查詢(SMS_URI,NULL,NULL,NULL, 「日期ASC」);。 startManagingCursor(光標); 而(cursor.moveToNext()){ 字符串ID = cursor.getString(cursor.getColumnIndex(「_ id」)); String address = cursor.getString(cursor.getColumnIndex(「address」)); String body = cursor.getString(cursor.getColumnIndexOrThrow(「body」)) ; 字符串PERSONNAME = getPersonName(ID,地址);如果 (personName.equals(名)) { bodies.add(體); } } – 2011-05-27 06:13:01

+0

我嘗試都asynctask和traceview。首先我要感謝你,因爲我學到了兩件新事物 - Asynctask以及如何使用traceview和一些adb的東西。我發現我的應用程序的總體性能的37%是由getPersonName()消耗的。你知道任何我可以用來獲取聯繫人姓名的替代方法嗎?這是我最後一個問題,在此之後,我根本不會打擾你。 非常感謝您的幫助。 :) – Varundroid 2011-05-27 11:28:22