Доступ к UI-Thread из неактивного объекта, такого как ([self executeSelectorOnMainThread]) в iOS - PullRequest
1 голос
/ 22 ноября 2011

Я перешел от разработки приложений для iOS к Android, поэтому столкнулся с некоторыми проблемами при поиске некоторых функций, которые раньше использовал.

Существует ли в Android функция, подобная [self performSelectorOnMainThread:@selector() withObject: waitUntilDone:];, к которой можно получить доступ из экземпляра любого класса, зная, что этот класс не наследуется от класса Activity.

Я обнаружил, что есть функция runOnUiThread, которая делает это, но я не мог ее использовать, поскольку мне нужно вызывать ее из неактивного объекта, поэтому есть способ получить доступ к текущей видимой активности или я должен использовать другое решение.

Ответы [ 2 ]

5 голосов
/ 22 ноября 2011

Если у вас нет объекта деятельности, вы можете использовать обработчики. Класс «Обработчик» может обновлять пользовательский интерфейс. Дескриптор предоставляет методы для получения сообщений и для запуска. Чтобы использовать обработчик, вы должны создать его подкласс и переопределить handleMessage () для обработки сообщений. Для обработки исполняемых файлов вы можете использовать метод post (); Вам нужен только один экземпляр обработчика в вашей деятельности.

Вы можете отправлять сообщения с помощью метода sendMessage (Message msg) или sendEmptyMessage.

Пример примера

  1. Пример обработчика

В этом примере мы используем класс «Обработчик» для обновления ProgressBar в фоновом потоке.

Создайте новый проект Android "de.vogella.android.handler" с действием "ProgressTestActivity". Создайте следующий макет "main.xml". Этот макет содержит ProgressBar и устанавливает его внешний вид с помощью стиля.

Измените свою активность на следующую:

package de.vogella.android.handler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.ProgressBar;

public class ProgressTestActivity extends Activity {
private Handler handler;
private ProgressBar progress;


/** Called when the activity is first created. */

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    progress = (ProgressBar) findViewById(R.id.progressBar1);
    handler = new Handler();
}

public void startProgress(View view) {
    // Do something long
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i <= 10; i++) {
                final int value = i;
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        progress.setProgress(value);
                    }
                });
            }
        }
    };
    new Thread(runnable).start();
}
}

Запустите ваше приложение. Как только вы нажмете кнопку, ProgressBar будет обновляться из фонового потока.

Образец от http://www.vogella.de/articles/AndroidPerformance/article.html#concurrency_handler

1 голос
/ 22 ноября 2011

Любой класс может получить доступ к Activity, если вы предоставите в этот класс какой-либо открытый метод, который может захватить текущий Activity или Context.Например:

    public class SomeClass {

    public void launchActivity(Context context) {
       context.startActivity(new Intent(context, SomeOtherActivity.class));
    }

    public void showToast(Context context) {
       Toast.makeText(context, "check me out!", Toast.LENGHT_LONG).show();
    }

 }

В этом нет магии.Java, как и Objective-C, является объектно-ориентированным языком.Дело в том, что для того, чтобы «дать» вашему обычному Java-объекту текущий Activity, вам нужно будет передать его ему из этого Activity.

...