Qt 调用原生态的Toast—— Qt For Android

背景知识

在想调用原生态的Toast时,发现直接调用是不行的。Android的UI控制都是在主线程(也可称谓ui线程),Toast亦属于ui的一部分,故也应在主线程中调用。

Handler用于进行Android线程间的通信。

Handler介绍

Handler是一套 Android 消息传递机制,主要用于线程间通信。

用最简单的话描述: handler其实就是主线程在起了一个子线程,子线程运行并生成Message,Looper获取message并传递给Handler,Handler逐个获取子线程中的Message.

Binder/Socket用于进程间通信,而Handler消息机制用于同进程的线程间通信

可以说只要有异步线程与主线程通信的地方就一定会有 Handler。
 

Android——Handler详解_android handler_Yawn__的博客-CSDN博客

 

 代码展示

MainActivity.java

package com.example.hellowolrd;

import android.content.Intent;
import android.os.Looper;
import android.widget.Toast;
import android.os.Handler;
import android.os.Message;
import org.qtproject.qt5.android.bindings.QtActivity;


public class MainActivity extends org.qtproject.qt5.android.bindings.QtActivity {

    private static MainActivity m_instance;
    private static Handler m_handler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
             case 1:
                 Toast toast = Toast.makeText(m_instance,(String)msg.obj, Toast.LENGTH_LONG);
                 toast.show();
                 break;
             };
         }
     };
     public MainActivity(){
             m_instance = this;
         }
     public static void makeToast(String s){
         m_handler.sendMessage(m_handler.obtainMessage(1, s));
     }

}

c++

    QAndroidJniObject javaToast = QAndroidJniObject::fromString("Hello~~~");
    QAndroidJniObject::callStaticMethod("com/example/hellowolrd/MainActivity",
                                        "makeToast",
                                        "(Ljava/lang/String;)V",
                                        javaToast.object());

你可能感兴趣的:(Qt,For,Android,android,qt,java)