Android - 如何使 Activity 加载更快?

标签 android android-activity load sms performance

我目前正在开发一款与普通短信应用非常相似的短信应用。

但问题是我的应用加载速度比普通(内置)应用慢得多。

这是我的应用程序代码:-

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)加载列表,但在这两种情况下,我的应用加载速度都非常慢。如何加载更快?我可能更喜欢我的自定义适配器的解决方案,因为将来我可能需要在我的布局中添加一些东西,比如照片和其他东西。

谢谢。请帮忙!!

最佳答案

您可以使用 http://developer.android.com/guide/developing/tools/traceview.html分析器来定位性能问题。我猜问题是您正在同步进行磁盘操作 (Cursor cursor = getContentResolver().query(...))。尝试使用 AssyncTask 使此异步,即

关于Android - 如何使 Activity 加载更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6136322/

相关文章:

android - 是否可以将 onclick 监听器添加到 android 中的 remoteviews

android - 我可以为在 Android Play 商店和 Android TV 商店中注册的应用程序使用不同的名称吗?

android - startActivity() 与 context.startActivity()

android - 如何从 surfaceView 完成一个 Activity 并调用带有附加功能的新 Activity

javascript - Jquery 在 .load() 之前显示图像

amazon-web-services - 如何使用代理协议(protocol)版本 2 通过 AWS Network Load Balancer 获取客户端的真实 IP 地址?

java - 错误 java.lang.RuntimeException : java. lang.RuntimeException : com. android.builder.dexing.DexArchiveMergerException:无法合并 dex

java - 清除堆栈 Activity 并完成

java - LibGDX : How to retrieve a picture that was taken through the camera and saved locally?

android - 如何在Python中区分 "Android"和其他 "Linux"操作系统?