0

我有一个文本字段(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;
    } }
4

2 回答 2

2

不要尝试使用后台线程更改 UI。仅使用主线程来更新对 UI 的任何更改。
查看使用线程更新 Android UI

于 2013-05-30T12:22:16.723 回答
0

每个设备的 cpu 限制为它一次可以做的一定数量的事情。与用户交互 + 更新 UI + 发送一个 http 请求,这是一个非常庞大的操作,尤其是如果你在很短的时间内做了很多。

尝试等待来自用户的更多数据,并且只有当他在 X 时间内没有写任何东西时才分批发送您的请求。

于 2013-05-30T12:23:39.377 回答