0

編輯:改變了這篇文章的標題,因爲這個問題是由於不正確的使用字符串連接。Intent.EXTRA_TEXT緩慢更新[由於不正確的使用字符串

我敢肯定我會不必要地複雜這個,但我有問題動態更新我的intent用於ShareActionProvider

該文檔說,我不需要擔心onClick,因爲ShareActionProvider負責這一點,但是,我只想在用戶單擊ActionProvider時構建Intent.EXTRA_TEXT

我不想以交互方式更新意圖的原因是因爲它需要大約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使用戶點擊意圖被髮送到活動。

我只是想以這種錯誤的方式?

回答

0

要回答我自己的問題,並得到一些來自Android神的幫助。

基本上,我的意圖建設花了這麼長時間的原因是因爲每次我做了字符串連接(str + =)緩衝區需要放大(我應該知道這一點)。

隨着一點點的指導我用DDMS Profiler來研究這個問題:

Don't do str += ever again.

我後來決定用初始化的額外意圖的信息和BAM,這樣做的目的的大小StringBuilder對象現在需要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();