0

テキストの行を読み取るアプリケーションを作成し、行が読み取られるたびに各単語を連続して強調表示します。行の再生を開始し (これは子供向けの絵本なので、一度に 1 行ずつ)、テキストを読み、各単語の長さ (ミリ秒単位) を読み、適切なタイミングでテキストビューで単語を強調表示します。

私のアプローチは次のとおりです。文の単語を配列に入れます(最終的には各作業の長さですが、今のところ、それぞれを1000ミリ秒と仮定します)。単語を textViewPartial に書き込みます。単語の長さを遅らせます。文に次の単語を追加して、textViewPartial....などに書き込みます。

でもタイミングが掴めない。ハンドラーと非同期で見つけることができるすべてを読んでください。私が思いつくことができる最高のものは次のとおりです-ポストディレイドハンドラーをforループ内に配置しました。私の脳は、ループがルーパーになるたびに遅延すると言っていますが、logcat の出力からそうではないことがわかります。for ループが開始するまでの遅延は 1 つだけです。これは私の最初の投稿であり、皆さんがどのように Eclipse から色付きのコードを取得しているのかわかりません。

   public class LineOutHanler extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_line_out_hanler);
    TextView t = new TextView(this);
    t=(TextView) findViewById (R.id.textView10);
    String textOut = "Oh how my spleen aches to see you again";
    final TextView textViewPartial = (TextView) findViewById(R.id.textView11);
    final String[] wordsOut = textOut.split(" ");
    final int wordsInSentence = wordsOut.length;
    int[] wordLength = new int[wordsInSentence];
            for (int counter=0;counter<=wordsInSentence-1;counter++){
            wordLength[counter]=wordsOut[counter].length();}
    String partialSentence ="";
    for (int counter=0; counter<=wordsInSentence-1; counter++){   
            String  c= addWordsOut(wordsOut[counter], partialSentence);
            textViewPartial.setText(c);
            partialSentence = c;
            Log.d("Word", partialSentence);
    final String partialOut=c;
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
      @Override
      public void run() {
                        textViewPartial.setText(partialOut);
            Log.d("Handler", partialOut);
        }
    } , 2000);}
    }
public String addWordsOut (String part, String upToHere)  {
upToHere=upToHere+" " + part;
return upToHere;
}
}

および logcat の出力:

10-19 23:07:32.248: E/cutils-trace(39): Error opening trace file: No such file or directory (2)
10-19 23:07:32.368: D/AudioSink(39): bufferCount (4) is too small and increased to 12
10-19 23:07:32.379: D/Word(821):  Oh
10-19 23:07:32.379: D/Word(821):  Oh how
10-19 23:07:32.388: D/Word(821):  Oh how my
10-19 23:07:32.388: D/Word(821):  Oh how my spleen
10-19 23:07:32.388: D/Word(821):  Oh how my spleen aches
10-19 23:07:32.388: D/Word(821):  Oh how my spleen aches to
10-19 23:07:32.388: D/Word(821):  Oh how my spleen aches to see
10-19 23:07:32.398: D/Word(821):  Oh how my spleen aches to see you
10-19 23:07:32.398: D/Word(821):  Oh how my spleen aches to see you again
10-19 23:07:33.328: I/Choreographer(288): Skipped 30 frames!  The application may be doing too much work on its main thread.
10-19 23:07:33.368: I/ActivityManager(288): Displayed com.example.testtextout/.LineOutHanler: +1s820ms
10-19 23:07:35.320: W/AudioFlinger(39): write blocked for 1091 msecs, 1 delayed writes, thread 0x40e0b008
10-19 23:07:35.320: D/Handler(821):  Oh
10-19 23:07:35.329: D/Handler(821):  Oh how
10-19 23:07:35.329: D/Handler(821):  Oh how my
10-19 23:07:35.329: D/Handler(821):  Oh how my spleen
10-19 23:07:35.329: D/Handler(821):  Oh how my spleen aches
10-19 23:07:35.329: D/Handler(821):  Oh how my spleen aches to
10-19 23:07:35.339: D/Handler(821):  Oh how my spleen aches to see
10-19 23:07:35.339: D/Handler(821):  Oh how my spleen aches to see you
10-19 23:07:35.339: D/Handler(821):  Oh how my spleen aches to see you again
10-19 23:08:30.588: D/dalvikvm(396): GC_FOR_ALLOC freed 452K, 15% free 3047K/3556K, paused 40ms, total 65ms
10-19 23:25:42.149: D/dalvikvm(288): GC_FOR_ALLOC freed 850K, 31% free 5593K/7996K, paused 99ms, total 117ms

最初の質問 - そもそもこれは正しいアプローチですか? 2 番目の質問 - どうすれば動作させることができますか?

どうもありがとう。

4

1 に答える 1

1

問題は for ループにあります。ランナブルを投稿するときは、常に現時点から 2000 ミリ秒後に実行するように投稿します。コードが実行されると、これらのアクションがほぼ同時に送信されます。したがって、出力が 2 秒後に同時に発生することがわかります。代わりに、以下で行うことを行うことができます。ここでは、作業中の単語に基づいて、将来 2000 ミリ秒の倍数で投稿します。

for (int counter=0; counter<=wordsInSentence-1; counter++){   
        String  c= addWordsOut(wordsOut[counter], partialSentence);
        textViewPartial.setText(c);
        partialSentence = c;
        Log.d("Word", partialSentence);
        final String partialOut=c;
        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                        textViewPartial.setText(partialOut);
                        Log.d("Handler", partialOut);
               }
        } , 2000*(counter+1));
}

実装に関しては、前のランナブルが完了するたびに新しいランナブルを投稿することをお勧めします。そうしないと、多くのランナブルを作成してポストし、不必要にメモリを消費し、ハンドラーのクリーンアップが面倒になる可能性があります。最初の POC の場合、これはそれほど悪くなく、後で簡単に変更できます。

于 2013-10-20T04:15:30.097 に答える