处理程序,线程和视图操作

时间:2015-08-23 15:52:54

标签: android android-handler

我正在尝试使用Fragment的onResume()方法操作TextView。我已经定义了一个处理程序,并在调用处理程序run()后尝试从post()内更改文本。虽然这确实改变了TextView的文本,但我尝试在Handler之外操作相同的TextView,但TextView的文本不会改变。在这种情况下发生了什么,以及为什么TextView没有更改为" BAR"。我执行的所有代码都在下面:

@Override
public void onResume(){
    super.onResume();

    mHandler = new Handler();
    Looper looper = mHandler.getLooper();
    Thread thread = looper.getThread();
    Log.v("THREAD",thread.getName());
    // prints main in logcat

    mHandler.post(new Runnable(){

        @Override
        public void run() {
            try {

                // TextView's text changes to "FOO"
                mTextView.setText("FOO");
            }
            catch(Exception exception){

                exception.toString();
            }
        }
    });

    // Logcat prints this message  
    Log.v("AFTER HANDLER","AFTER HANDLER");
    // TextView's text does not change to "BAR"
    mTextView.setText("BAR");
}

如果我错过了一些基本的东西,请道歉,但对此的任何澄清都会非常有帮助。谢谢!

3 个答案:

答案 0 :(得分:2)

onResume()适用于您希望从UI线程外部执行UI操作的情况。当它添加您传递给该方法的runnable,并对其进行排队,以便在下一次UI传递时,您的runnable将会运行。

无论如何,在UI线程上调用

TextView's,因此不需要在UI线程上排队此操作。它的工作方式不会改变 - 在下一个UI传递(不是当前传递,下一个)时,TextView文本将更改为“FOO”。

在onResume方法的UI线程的当前传递中,您还将文本设置为“BAR”。一瞬间,dataSize = size(datain,2); upsamp = [datain.' zeros(dataSize,1) zeros(dataSize,1)]; len = size(upsamp,1) * size(upsamp,2); upsamp = reshape(upsamp.',1,len); 确实会显示此文本。但是,在不久之后发生的下一个UI传递中,“BAR”文本被替换为“FOO”。

这就是您没有看到“FOO”文本的原因。您之后会立即安排另一个UI通道,并且在您发现文本不同之前会替换文本。

答案 1 :(得分:1)

Handler.post(Runnable r)会将r添加到邮件队列中。它不会立即运行。在你的情况下" BAR"首先设置,之后" FOO"已经确定了。

更多详情here

答案 2 :(得分:0)

mTextView.setText("BAR")可能是第一个,mTextView.setText("FOO")是第二个。

如果代码在下面会发生什么?

@Override
public void onResume(){
    super.onResume();

    mHandler = new Handler();
    Looper looper = mHandler.getLooper();
    Thread thread = looper.getThread();
    Log.v("THREAD",thread.getName());
    // prints main in logcat

    mHandler.post(new Runnable(){

        @Override
        public void run() {
            try {
                Log.v("Which is earlier?", "FOO");
                mTextView.setText("FOO");
            }
            catch(Exception exception){

                exception.toString();
            }
        }
    });

    Log.v("Which is earlier?", "BAR");
    mTextView.setText("BAR");
}