zoukankan      html  css  js  c++  java
  • Android 在子线程中更新UI

    今天在做练习时,在一个新开启的线程中调用“Toast.makeText(MainActivity.this, "登陆成功",Toast.LENGTH_SHORT).show();

    报错为:Can't create handler inside thread that has not called Looper.prepare()

    在新线程中添加Looper.prepare();和Looper.loop();即可。

    示例代码段:(该代码在新开的线程中)

                     Looper.prepare();
                                JSONObject jsonObject = new JSONObject(return_src);
                                System.out.println("json:"
                                        + jsonObject.getString("result"));
                                if (jsonObject.getString("result").equals("ok")) {
                                    Toast.makeText(MainActivity.this, "登陆成功",
                                            Toast.LENGTH_SHORT).show();
                                } else {
                                    Toast.makeText(MainActivity.this, "登陆失败",
                                            Toast.LENGTH_SHORT).show();
                                }
                                Looper.loop();

    这个错误的根本关键在于:在子线程中执行了更新UI的操作,就如使用了Toast。

    那么,在子线程中执行更新UI操作该怎么做呢?

    有三个方法:

    1. 在新线程中添加Looper.prepare();和Looper.loop();,在两者之间执行你想要的操作。(有网友说这种办法会终止,子线程之后的代码,本人没尝试过。
    2. 在子线程中定义runOnUiThread()来执行在UI的改变操作。
    3. 在UI线程中定义handler和使用message。

    我们用这三种方式来实现同一段代码:

    第一种:(即上面已贴代码)

    第二种:(在子线程中实现以下代码)

                  runOnUiThread(new Runnable() {
                                public void run() {
                                    try {
                                        JSONObject jsonObject = new JSONObject(
                                                return_src);
                                        System.out.println("json:"
                                                + jsonObject.getString("result"));
                                        if (jsonObject.getString("result").equals(
                                                "ok")) {
                                            Toast.makeText(MainActivity.this,
                                                    "登陆成功", Toast.LENGTH_SHORT)
                                                    .show();
                                        } else {
                                            Toast.makeText(MainActivity.this,
                                                    "登陆失败", Toast.LENGTH_SHORT)
                                                    .show();
                                        }
                                    } catch (JSONException e) {
                                        e.printStackTrace();
                                    }
                                }
                            });

    第三种:

    (在主线程中,获取消息并判断属性,再执行操作)

    Handler handler = new Handler() {
    
            @Override
            public void handleMessage(Message msg) {
                if (msg.obj == null) {
                    Toast.makeText(MainActivity.this, "消息传递失败", Toast.LENGTH_SHORT)
                            .show();
                    return;
                }
                String return_src = (String) msg.obj;
                try {
                    JSONObject jsonObject = new JSONObject(return_src);
                    System.out.println("json:" + jsonObject.getString("result"));
                    if (jsonObject.getString("result").equals("ok")) {
                        Toast.makeText(MainActivity.this, "登陆成功",
                                Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(MainActivity.this, "登陆失败",
                                Toast.LENGTH_SHORT).show();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        };

    (在子线程中,创建消息,并设置消息属性,发送消息)

    return_src为需要返回的数据。

                   Message msg=new Message();
                             msg.obj=return_src;
                             handler.sendMessage(msg);
  • 相关阅读:
    FreePascal
    Delphi
    FreePascal
    FreePascal
    Linux
    FreePascal
    FreePascal
    CodeTyphon
    IDEA
    工作流科普——don't ask i don't know either
  • 原文地址:https://www.cnblogs.com/scetopcsa/p/3776762.html
Copyright © 2011-2022 走看看