Java Intent.EXTRA_文本更新缓慢[由于字符串使用不正确

Java Intent.EXTRA_文本更新缓慢[由于字符串使用不正确,java,android,android-intent,stringbuilder,string-concatenation,Java,Android,Android Intent,Stringbuilder,String Concatenation,编辑:更改了此帖子的标题,因为该问题是由于不正确使用字符串连接造成的 我确信我没有必要让这件事复杂化,但我在动态更新我的意图以供ShareActionProvider中使用时遇到了问题 文档中说,我不需要担心onClick,因为ShareActionProvider会处理这个问题,但是,我只想在用户单击ActionProvider时构建Intent.EXTRA\u TEXT 我不想以交互方式更新意图的原因是,为意图构建额外信息需要大约2000ms的时间,用户可以相对较快地工作,从而导致UI变得迟

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

我确信我没有必要让这件事复杂化,但我在动态更新我的
意图
以供
ShareActionProvider
中使用时遇到了问题

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

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

我确信我可以坐下来研究如何在后台使用AsyncTask来构建意图,但这似乎有点过分了

我尝试了
setOnShareTargetSelectedListener
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();

public类buildHTML{
私人ArrayList mAddress;
私有阵列列表mBits;
buildHTML(ArrayList地址,ArrayList位){
mAddress=地址;
mBits=位;
}
公共字符串getText(){
字符串str;
str=“DMX:地址\n”;
str+=“----:-----------\n”;
int count=mAddress.size();
对于(int i=0;i
我所要做的就是在用户单击ShareActionProvider时运行
buildIntent()
,以便将意图发送到活动


我这样做是不对的吗?

我将在安卓和安卓诸神的帮助下回答我自己的问题

基本上,我的意图构建花费如此长的时间是因为每次我进行字符串连接(str+=)时,缓冲区都需要放大(我应该知道这一点)

在一些指导下,我使用DDMS探查器深入研究了这个问题:

然后,我决定使用一个
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;
}
公共字符串getText(){
字符串str;
str=“DMX:地址\n”;
str+=“----:-----------\n”;
int count=mAddress.size();
对于(int i=0;i
为此:

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();
公共字符串getText(){
int count=mAddress.size();
StringBuilder str=新的StringBuilder((计数+2)*16);
str.append(“DMX:ADDRESS\n”);//16
str.append(“--:-----------\n”);//16
for(int i=0;i
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();