Обновление интерфейса в Android [с очередью] - PullRequest
1 голос
/ 08 апреля 2020

У меня есть и android приложение (java), и в настоящее время у меня есть активность, которая вызывает другой класс (класс A). в классе А у меня есть пулы исполнителей потоков, которые запускаются каждую секунду и добавляют значения в очередь. Я хочу получить значения из этой очереди, чтобы обновлять текстовое представление в моей Android активности каждую секунду с помощью queue.remove, чтобы получить значение. Как я могу обновлять текстовое представление в потоке пользовательского интерфейса каждую секунду значениями из этой очереди в классе a?

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

В дополнение к ответу oto, вы также можете использовать Handler / Looper:

import android.os.Handler;
import android.os.Looper;

public class UIActivity extends AppCompatActivity {
    private Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        TextView textView = findViewById(R.id.text_view);
        // defines a handler object attached to a UI-thread
        handler = new ViewHandler(Looper.getMainLooper(), textView);
        ClassA classA = new ClassA(this);
    }

    public synchronized void handleState(int state, String message) {
        Message completeMessage = handler.obtainMessage(state, message);
        completeMessage.sendToTarget();
    }
}

ViewHandler.kt:

const val MESSAGE_CODE = 0
class ViewHandler(looper: Looper, private val textView: TextView): Handler(looper) {
    override fun handleMessage(inputMessage: Message) {
        val text: String = inputMessage.obj as String
        when (inputMessage.what) {
            MESSAGE_CODE -> textView.text = text // update TextView  
            // update other UI-elements
            ... 
        }  
    }
}

Обновление TextView в ClassA:

public ClassA(UIActivity uiActivity) {
    ...
    // other thread
    queue.add(newValue) // invoke every second
    String oldValue = queue.remove() 
    uiActivity.handleState(MESSAGE_CODE, s);
}
0 голосов
/ 09 апреля 2020

Вы должны передать свою деятельность этому классу А. после этого вызовите функцию runOnUIThread () для этой переданной переменной, как показано здесь. { ссылка }
. Переданная переменная должна быть классом Activity для функции runOnUiThread. И если вы хотите получить доступ к textview, переменная должна быть вашим типом класса активности. PS сделайте текстовое поле publi c переменной вашей активности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...