2013-10-20 3 views
0

Im пишу приложение для чтения строки текста, выделяя каждое слово последовательно по мере чтения строки. Идея состоит в том, чтобы начать играть на линии (это книга с картинками для детей, поэтому по одной строке за раз), затем читать текст, длину каждого слова в миллисекундах, а затем в нужное время выделять слово в текстовом виде.android handler для последовательных задержек

Мой подход: Положите слова предложения в массив (и в конечном итоге длину каждой работы, но на данный момент просто принимайте 1000 мс каждый); Напишите слово textViewPartial; Задержка длины слова; Добавьте следующее слово в предложение и напишите его в textViewPartial .... и т. Д.

Но я не могу определить сроки. Прочитайте все, что я могу найти на обработчике и асинхронном режиме, и самое лучшее, что я могу придумать, следующее: я помещал обработчик postdelayed в цикл for. Мой мозг говорит, что он будет задерживаться каждый раз, когда цикл петлитель, но вы можете видеть из вывода logcat, которого нет. Перед запуском цикла for существует только одна задержка. Это мой первый пост, и я не вижу, как вы получаете свой цветной код из 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 

Первого вопрос - это правильный подход в первую очередь? Второй вопрос - как я могу заставить его работать?

Большое спасибо.

ответ

0

Проблема в вашей петле. Когда вы публикуете runnable, вы всегда отправляете сообщения для запуска 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)); 
} 

Что касается вашей реализации, я бы порекомендовал разместить каждую новую runnable, как и предыдущий. В противном случае вы могли бы создать и опубликовать множество runnables, без необходимости употребляйте ваше использование памяти и очистите обработчики от боли. Для начального POC это не так уж плохо и может быть легко изменено позже.

+0

Thankyou так много, что работает. Но предлагаете ли вы мне самим очистить инвентарь? Я вижу, что это будет хорошая практика. Я должен буду это изучить. – dulciepercy

+0

Я точно не помню, но я не считаю, что ваши runnables автоматически очищаются, если ваша активность останавливается, например. Если бы я использовал ваше приложение, меня бы раздражало, если бы вы оставили свое приложение, и ваша книга продолжала читать в фоновом режиме! Было бы лучше проверить документацию для проверки. – MJD

 Смежные вопросы

  • Нет связанных вопросов^_^