0

編集: この問題は文字列連結の不適切な使用が原因であったため、この投稿のタイトルを変更しました。

私はこれを不必要に複雑にしていると確信していますが、intentで使用するために動的に更新する際に問題が発生していShareActionProviderます。

ドキュメンテーションによると、 onClick がこれを処理するので心配する必要はありませんが、ユーザーが をクリックしShareActionProviderたときにのみ をビルドしたいと考えています。Intent.EXTRA_TEXTActionProvider

インテントをインタラクティブに更新したくない理由は、インテントの追加情報を構築するのに約 2000 ミリ秒かかり、ユーザーの作業が比較的速くなり、UI が遅くなるためです。

座って、AsyncTask を使用してバックグラウンドでインテントを構築する方法を理解できると確信していますが、それは少しやり過ぎのようです。

私は他の多くのコールバックを試しましsetOnShareTargetSelectedListeneronPrepareSubMenuが、それらはすべてインテントが渡された後に呼び出されているようで、情報が最新になるまでアクション プロバイダーを 2 回押す必要があります。

いくつかのコード; これは、私の意図を構築するために呼び出されます。

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の神々の助けを借りて、私自身の質問に答えようとしています。

基本的に、インテントの構築に時間がかかる理由は、文字列の連結 (str +=) を行うたびにバッファーを拡大する必要があったためです (知っておくべきでした)。

少しのガイダンスで、DDMS Profiler を使用して問題を掘り下げました。

str += を二度と実行しないでください。

次に、Extra Intent 情報と 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();
于 2013-06-21T05:59:44.470 に答える