Intereting Posts
Почему я не должен использовать шину сообщений вместо Loaders and Services? Android в тестировании подписки на приложения DDMS, не показывающая имя приложения Как нажать «ОК» на AlertDialog через код? Варианты сборки в Gradle для проекта библиотеки в Android Кто-нибудь знает, что вызывает «Имя пакета не является допустимым именем пакета» при добавлении нового макета? Могу ли я установить тайм-аут getaddrinfo в Android для DefaultHttpClient? Маркер Android между кнопками в макете сетки Как я могу получить разницу между двумя датами в android ?, проверял каждую вещь и сообщение Как изменить фрагмент с помощью операции «Нижняя навигация»? Android эквивалентен CocoaPods Pods-Acknowledgements.plist? Совместимость с API-интерфейсом API API уровня 21? (Поскольку появилось новое обновление SDK) Удалить значок android.widget.Toolbar shadow Как запустить приложение с помощью инструментов ADB для Android? Расширение класса в приложении в библиотеке проектов Android?

Просмотр обновления во время выполнения в Android

Пример довольно прост: я хочу сообщить пользователю о том, что делает приложение, просто показывая текст (canvas.drawText ()). Затем появляется мое первое сообщение, но не другие. Я имею в виду, у меня есть метод setText, но он не обновляется.

onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(splash); // splash is the view class loadResources(); splash.setText("this"); boundWebService(); splash.setText("that"): etc(); splash.setText("so on"); } 

Текстовый рисунок представления работает, делая только drawText в onDraw () ;, поэтому setText меняет текст, но не показывает его.

Кто-то порекомендовал мне заменить представление SurfaceView, но было бы много неприятностей только для нескольких обновлений, SO … как, черт возьми, я могу обновить представление динамически во время выполнения?

Это должно быть довольно просто, просто показывая текст за 2 секунды, а затем основной поток, делающий его материал, а затем обновляющий текст …

Благодаря!

Обновить:

Я попробовал реализовать handler.onPost (), но это одна и та же история. Позвольте мне поставить вам код:

 public class ThreadViewTestActivity extends Activity { Thread t; Splash splash; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); splash = new Splash(this); t = new Thread(splash); t.start(); splash.setTextow("OA"); try { Thread.sleep(4000); } catch (InterruptedException e) { } splash.setTextow("LALA"); } } 

А также:

 public class Splash implements Runnable { Activity activity; final Handler myHandler = new Handler(); public Splash(Activity activity) { this.activity=activity; } @Override public void run() { // TODO Auto-generated method stub } public synchronized void setTextow(final String textow) { // Wrap DownloadTask into another Runnable to track the statistics myHandler.post(new Runnable() { @Override public void run() { TextView t = (TextView)activity.findViewById(R.id.testo); t.setText(textow); t.invalidate(); } }); } } 

Хотя всплеск в другом потоке, я помещаю сон в основной поток, я использую обработчик для управления пользовательским интерфейсом и всего, он ничего не меняет, он показывает только последнее обновление.

Я еще не ударил это, но я думаю, что обычный шаблон состоит в том, чтобы выполнять длительную инициализацию в фоновом потоке и использовать Handler.post() для обновления пользовательского интерфейса. См. http://developer.android.com/reference/android/widget/ProgressBar.html для другого, но, возможно, связанного, примера.

Также см. Этот ответ , особенно первый абзац:

Вероятно, проблема заключается в том, что вы запускаете заставку (какой-то диалог, такой как ProgressDialog, который я предполагаю) в том же потоке, что и вся работа. Это не позволит обновлять экран заставки, что не позволяет отображать его на экране. Вам нужно отобразить заставку, запустить экземпляр AsyncTask, чтобы загрузить все ваши данные, а затем скрыть заставку после завершения задачи.

Обновление (на основе вашего обновления и вашего комментария): вы не должны обновлять пользовательский интерфейс в любом потоке, кроме тех, где создано ваше действие. Почему вы не можете загружать свои ресурсы в фоновый поток?

Во-первых: onCreate выполняется в основном потоке пользовательского интерфейса, поэтому обновления пользовательского интерфейса пока не покидают его. В основном вам нужен один поток для выполнения длительных запущенных задач и некоторый механизм для обновления данных в пользовательском интерфейсе.
Самый обычный подход – расширить AsyncTask, чтобы увидеть эту ссылку для получения дополнительной информации.

Я полагаю, что ваше представление является расширенным представлением, и вы вызываете onDraw для рисования представления, поэтому, возможно, представление не обновляет их состояние, поэтому попробуйте это

 onCreate(Bundle bundle) { setContentView(splash); // splash is the view class loadResources(); splash.setText("this"); splash.invalidate(); boundWebService(); splash.setText("that"): splash.invalidate(); etc(); splash.setText("so on"); splash.invalidate(); }