0

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

我确信我不必要地使这个复杂化,但我在动态更新我intent以在ShareActionProvider.

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

我不想以交互方式更新意图的原因是因为为意图构建额外信息需要大约 2000 毫秒,并且用户可以相对更快地工作,从而导致 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;
    }

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

我只是以错误的方式解决这个问题吗?

4

1 回答 1

0

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

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

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

不要再做 str += 了。

然后我决定使用一个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();
于 2013-06-21T05:59:44.470 回答