【问题标题】:Slow updating of Intent.EXTRA_TEXT [due to incorrect use of StringsIntent.EXTRA_TEXT 更新缓慢[由于不正确使用字符串
【发布时间】:2013-06-17 21:33:03
【问题描述】:

编辑: 更改了这篇文章的标题,因为问题是由于错误地使用了字符串连接。

我确信我不必要地使这复杂化,但我在动态更新我的 intent 以在 ShareActionProvider 中使用时遇到问题。

文档说我不需要担心 onClick,因为 ShareActionProvider 会处理这个问题,但是,我只想在用户单击 ActionProvider 时构建 Intent.EXTRA_TEXT

我不想以交互方式更新 Intent 的原因是因为它需要大约 2000 毫秒来构建 Intent 的额外信息,并且用户可以相对更快地工作导致 UI 变得迟缓。

我确信我可以坐下来弄清楚如何使用 AsyncTask 在后台构建 Intent,但这似乎有点矫枉过正。

我已经尝试过setOnShareTargetSelectedListeneronPrepareSubMenu以及其他一些回调,但它们似乎都是在传递意图后调用的,并且在信息更新之前需要按两次 Action Provider .

一些代码;这被称为构建我的意图:

public void buildIntent(){
    if (mShareIntent == null)
        return;
    mShareIntent.putExtra(Intent.EXTRA_SUBJECT, "Start:" + mAddressArray.get(0) + " Span:" + (mAddressArray.get(1)-mAddressArray.get(0)));

    buildHTML bh = new buildHTML(mAddressArray, mBitArray);

    mShareIntent.putExtra(Intent.EXTRA_TEXT, bh.getText());
    //mShareIntent.putExtra(Intent.EXTRA_HTML_TEXT, bh.getHTML());
    mShareActionProvider.setShareIntent(mShareIntent);

}

让一切变慢的是bh.getText();

public class buildHTML {
  private ArrayList<Integer> mAddress;
  private ArrayList<String> mBits;

  buildHTML(ArrayList<Integer> address, ArrayList<String> bits){
    mAddress = address;
    mBits = bits;
  }

  public String getText(){
    String str;
    str = "DMX : ADDRESS  \n";
    str += "--- : ---------\n";
    int count = mAddress.size();

    for (int i = 0; i < count ; i++) //takes up to 3000ms to run
       str += String.format("%03d : %s\n", mAddress.get(i), mBits.get(i));
    return str;
    }

我要做的就是在用户单击 ShareActionProvider 时运行buildIntent(),以便将意图发送到活动。

我是不是走错路了?

【问题讨论】:

    标签: java android android-intent stringbuilder string-concatenation


    【解决方案1】:

    在 Android 大神的帮助下回答我自己的问题。

    基本上,我的 Intent 构建花费了这么长时间的原因是,每次我进行字符串连接 (str +=) 时,都需要扩大缓冲区(我应该知道这一点)。

    在一些指导下,我使用 DDMS Profiler 来挖掘问题:

    然后我决定使用StringBuilder 对象初始化为额外意图信息和 BAM 的大小,在更糟糕的情况下,现在构建意图需要不到 17 毫秒。

    对于像我这样学习的人,我改变了这个:

    public String getText(){
    String str;
    str = "DMX : ADDRESS  \n";
    str += "--- : ---------\n";
    int count = mAddress.size();
    
    for (int i = 0; i < count ; i++) //takes up to 3000ms to run
       str += String.format("%03d : %s\n", mAddress.get(i), mBits.get(i));
    return str;
    }
    

    到这里:

    public String getText(){
        int count = mAddress.size();
    
        StringBuilder str = new StringBuilder((count+2)*16);
    
        str.append("DMX : ADDRESS  \n"); //16
        str.append("--- : ---------\n"); //16
    
        for (int i = 0; i < count ; i++)
            str.append(String.format("%03d : %s\n", mAddress.get(i), mBits.get(i)));
        return str.toString();
    

    【讨论】:

      猜你喜欢
      • 2017-09-27
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多