Intent.EXTRA_TEXT的缓慢更新[由于错误使用字符串

时间:2013-06-20 20:55:32

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

编辑: 更改了此帖子的标题,因为该问题是由于错误使用字符串连接造成的。

我确定我不必要地复杂化了这一点,但我在动态更新intent时遇到问题,无法在ShareActionProvider中使用。

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

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

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

我已经尝试了ActionProvidersetOnShareTargetSelectedListener以及其他一些回调,但它们似乎都在传递意图后被调用,并且在信息出现之前需要两次按下Action Provider是最新的。

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

onPrepareSubMenu

减慢一切的因素是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();

我尝试做的就是当用户点击ShareActionProvider时运行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; } ,以便将意图发送到活动。

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

1 个答案:

答案 0 :(得分:0)

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

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

在一点指导下,我使用DDMS Profiler来深入研究问题:

Don't do str += ever again.

然后我决定使用一个StringBuilder对象初始化为额外意图信息和BAM的大小。在最坏的情况下,意图需要不到17ms的时间来构建。

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

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();