Android – с помощью runOnUiThread для изменения пользовательского интерфейса из потока

Я использую пользовательское представление заголовка и хотел бы показать / скрыть панель прогресса в представлении названия, когда поток работает.

Это мой XML-заголовок

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/image_left_btn" android:layout_width="75dip" android:layout_height="wrap_content" android:text="Back" /> <TextView android:id="@+id/image_title_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="20dip" android:textStyle="bold" android:textColor="#fff" android:layout_gravity="center" android:gravity="center" android:paddingLeft="8dip" android:paddingRight="8dip" /> <ProgressBar android:id="@+android:id/progress_small_title" style="?android:attr/progressBarStyleSmall" android:layout_width="75dip" android:layout_height="wrap_content" android:paddingRight="8dip"/> </LinearLayout> 

В моей деятельности, установив это как пользовательскую строку заголовка, я делаю это

 titleProgress = (ProgressBar)findViewById(R.id.progress_small_title); titleProgress.setVisibility(View.INVISIBLE); 

Где titleProgress – объект ProgressBar.

Это то, что я делаю в своей теме

 runOnUiThread(new Runnable() { public void run() { titleProgress.setVisibility(View.VISIBLE); } }); //long operation here runOnUiThread(new Runnable() { public void run() { titleProgress.setVisibility(View.INVISIBLE); } }); 

Но нет изменений в индикаторе выполнения. Он никогда не отображается. Может кто-нибудь, пожалуйста, скажите мне, что не так с кодом?

Можно ли отобразить панель прогресса заголовка в пользовательском заголовке?

Благодарю.

Solutions Collecting From Web of "Android – с помощью runOnUiThread для изменения пользовательского интерфейса из потока"

Несколько вещей, чтобы попробовать:

1) (Возможно, это не так) Убедитесь, что « titleProgress » нестабилен.

2) Попробуйте бросить несколько postInvalidate() или titleProgress.postInvalidate() там, чтобы вызвать перерисовку.

3) Приняли ли вы сакрафизацию машины x486 на аллее, напоминающем гигантский зеленый робот? (просто шучу)

Дайте мне знать, если первые два (и если вы действительно в отчаянии, третий) доставят вас куда угодно.

В этом случае вы должны использовать AsyncTask, см. http://developer.android.com/reference/android/os/AsyncTask.html.

Если вы не нацелены на версию Android версии до 1.5, вам придется использовать другой класс UserTask. См. http://android-developers.blogspot.com/2009/05/painless-threading.html.

Использовать связь с обработчиками,

  1. Исполнять свою нить
  2. В run() : вы должны отправить сообщение обработчику, который обновит progressBar (по горизонтали, конечно): handler.sendMessage(handler.obtainMessage());
  3. В своей деятельности вы должны переопределить метод handleMessage(Message msg ) : вот так:

     handler = new Handler(){ @override public void handleMessage(Message msg ) { //here you write the code which will update your progressBar } }; 

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

Попробуйте изменить стиль ProgressBar на горизонтальный:

 style="?android:attr/progressBarStyleHorizontal" 

Оригинал

 style="?android:attr/progressBarStyleSmall" 

Дает круговой «прогрессбар», который не может быть полностью виден в заголовке.