java - 与用户交互 UI 并从后台线程更新 UI

标签 java android multithreading user-interface

我有一个文本字段(EditText),并且在每次文本更改的事件 onTextChanged 中,我在单独的线程中发送 HTTP 查询。我需要从后台线程更新 UI。

一切都很好,我知道如何从后台线程更新 UI,但是当用户在文本字段中键入文本时,键盘在每次点击时都没有响应(随着时间的推移),结果并不是整个文本都写入到文本域。仅当后台线程更新 UI 时才会发生。

我尝试降低后台线程的优先级,但什么也没有:(

我不知道我做错了什么,请帮助我:)

//Create a background thread on UI thread
ex = new ExampleThread2(this, text);
ex.start();

//ExampleThread2.java

public class ExampleThread2 extends Thread implements Handler.Callback {

    private static final String LOG_TAG = ExampleThread2.class.getSimpleName();

    Semaphore s = new Semaphore(0);

    public static final int BEGIN_TASK = 1; 
    public static final int END_TASK = 2; 

    private boolean running = true;



    public Handler mLoaderHandler;
    public TModel mLoaderCallback;

    public ExampleThread2(TModel callback, String text) {
         this.mLoaderCallback = callback;
    }

    void sendMessage(int message){
        Message msg = mLoaderHandler.obtainMessage();
        msg.what = message;
        mLoaderHandler.sendMessage(msg);
    }

    @Override
    public void run(){

        Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

        //HandlerThread myHandlerThread = new HandlerThread("MyHandlerThread", Process.THREAD_PRIORITY_BACKGROUND);
        //myHandlerThread.start();

        this.mLoaderHandler = new Handler(Looper.getMainLooper(), this);



        do {
            sendMessage(BEGIN_TASK); //Updates UI
            start2(); //main work
            sendMessage(END_TASK); //Updates UI


                try {
                    s.acquire();
                    if(s.availablePermits() > 0){
                        s.acquire(s.availablePermits());
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace(); 
                }

        } while(running);



        // Tell the handler thread to quit
        //myHandlerThread.quit();
    }

    @Override
    public boolean handleMessage(final Message msg) {
        Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
        switch (msg.what) {
           case BEGIN_TASK:

                mLoaderHandler.post(new Runnable() {
                    @Override
                    public void run() {
                         updateUI();
                    }
                });

                break;
            case END_TASK:

                mLoaderHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        updateUI();
                    }
                });

                break;
    } }

最佳答案

不要尝试使用后台线程更改 UI。仅使用主线程来更新 UI 的任何更改。
Updating Android UI using threads

关于java - 与用户交互 UI 并从后台线程更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16835891/

相关文章:

android - 无法获取 Android View 的资源 ID

android - 当用户未插入任何值时,我的应用程序崩溃了 android studio

linux - iptables 线程安全吗?

multithreading - 通过计数测试信号量

android - 谷歌地图 V2 错误

c++ - boost thread_group 将 unique_ptr 的所有权移动到线程

没有 Try 和 Catch 的 Java 代码

java - Oracle Advanced Queue - 出队后删除消息

java - 使用 Hibernate、Postgres 和 Guice Provider 时“事务中空闲”

java - 无法通过jconsole连接到docker容器中的jmx jar进程