【问题标题】:Unable to update the UI using the message from the handler无法使用来自处理程序的消息更新 UI
【发布时间】:2015-04-23 12:33:33
【问题描述】:

大家好,我是android应用程序开发的新手。我已经编写和编码并尝试从从处理程序获得的消息中更新 UI。我试图调试代码,但我找不到错误是什么。请帮帮我。谢谢。

    package com.threadcommunicationexample;

    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;

    public class MainActivity extends Activity implements OnClickListener {

    Button Click;
    TextView Message;
    Handler Mrmessenger;
    int Counter = 0;

    /*
     *Initialisation area.... 
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Click = (Button) findViewById(R.id.ClickButton);
    Message = (Button) findViewById(R.id.TextView);
    Click.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
    // Operation to be performed after the button click 

    Runnable myThreadRunner = new Runnable() {

        @Override
        public void run() {

        // Saving the text in bundle and passing it to handler .... 

            while (Counter < 100) {
                try {
                    Thread.sleep(100);
                    Message msg = Mrmessenger.obtainMessage();
                    Bundle myBundle = new Bundle();
                    myBundle.putString("Communication", "Loading....");
                    msg.setData(myBundle);

                //Sending the bundle to Handler 

                    Mrmessenger.sendMessage(msg);

                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                Mrmessenger = new Handler() {

                    public void handleMessage(final Message msg) {

                        Mrmessenger.post(new Runnable() {
     // Getting the message from the handler and updating it using textview

                            @Override
                            public void run() {
                                Bundle ComBundle = msg.getData();
                                // TODO Auto-generated method stub
                                String myMessage = ComBundle
                                        .getString("Communication");
                                Message.setText(myMessage);
                            }
                        });

                    }

                };
                Counter++;
            }

        }

    };

    Thread myRunner = new Thread(myThreadRunner); 
    //creating a thread and passing the runnable object.
    myRunner.start();

   }

   }

【问题讨论】:

    标签: android multithreading android-layout android-handler


    【解决方案1】:

    一方面,这条线 Message msg = Mrmessenger.obtainMessage(); 将失败,因为您直到几行之后才初始化 Mrmessenger

    建议您使用AsyncTask 处理此类事情;它处理所有线程,因此您不必这样做。

    另外:根据 Java 约定,变量名应以小写字母开头,类名应以大写字母开头。这将使您的代码更容易被其他人阅读。

    【讨论】:

    • 实际上我正在练习和学习线程和线程间通信的概念......作为其中的一部分,我正在尝试这样的例子......
    • 是的,这是我在某个地方初始化它的错误,我之前曾调用过它......我已经纠正了它,它工作了..!!!!谢谢 Bohica ...
    【解决方案2】:

    您的代码的问题是,您的处理程序中的 run 方法是在主 / ui 线程之外的另一个线程上调用的。 要使代码正常工作,您可以使用以下代码..

    runOnUiThread(new Runnable() {
        public void run() {
            Message.setText(myMessage);
        }
    });
    

    ..在 ui 线程上显式运行 ui 更新。

    【讨论】:

    • 实际上在初始化部分的程序中存在一个愚蠢的错误......我试图将文本“查看为按钮”进行类型转换......我已经更正了,而且......我有编辑了你说的代码,用runon Ui方法替换它,但它仍然崩溃......
    • 请发布您崩溃的堆栈跟踪。
    猜你喜欢
    • 2014-02-21
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    相关资源
    最近更新 更多