c# - Android & Unity3D - 函数调用转到错误的线程

标签 c# android multithreading unity-game-engine

所以我创建了一个在 Unity 游戏中显示广告的插件。在 Unity 中,我想调用扩展 UnityPlayerActivity 的类中的方法。这是我的一些来自 com/mycompany/mygame/MainActivity.java 的代码:

public class MainActivity extends UnityPlayerActivity {

    private static AdView adView;

    // Code the initializes the ad view goes here
    ...

    public static void hideAd() {
        adView.setVisibility(View.INVISIBLE);
    }

    public static void showAd() {
        adView.setVisibility(View.VISIBLE);
    }
}

hideAd()showAd() 是我希望能够从 Unity 调用的方法。在 Unity 中,这是我必须测试我的插件的一些示例代码:

AndroidJavaClass ajc;
bool ohBool = true;

void Update () {
    foreach (Touch touch in Input.touches) {
        if (touch.phase == TouchPhase.Began) {
            // Call my function
            float touchLoc = Camera.main.ScreenToWorldPoint(touch.position).y;
            if (touchLoc > 0.0f) {
                if (showAd) {
                    ajc.CallStatic("hideAd");
                    showAd = false;
                }
                else {
                    ajc.CallStatic("showAd");
                    showAd = true;
                }
            }
        }
    }
}

但是,只要发生这些函数调用,LogCat 就会向我吐这个:

AndroidJavaException: android.view.ViewRootImpl$CalledFromWrongThreadException:
Only the original thread that created a view hierarchy can touch its views.

我该怎么办?

编辑:这是我要求的初始化代码:

void Start() {
    AndroidJNI.AttachCurrentThread();
    ajc = new AndroidJavaClass("com.mycompany.mygame.MainActivity");
}

最佳答案

首先尝试附加当前线程。

void Start() {
    AndroidJNI.AttachCurrentThread();
    AndroidJavaClass ajc = new AndroidJavaClass("com.mycompany.mygame.MainActivity"); //This is your java class hierarchy
    ajc.CallStatic("showAd");
}

关于c# - Android & Unity3D - 函数调用转到错误的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23749341/

相关文章:

android - 如何将 Intent 从库模块中的 Activity 发送到主应用程序的 Activity

android - 有一个Base Activity类好不好?

c++ - 如何检查线程是否已在 C++11 及更高版本中完成工作?

c# - 如何在不安装 .net 的情况下运行 .net 应用程序?

java - 从 Android 上传照片

c# - DataContractJsonSerializer 解析iso 8601日期

java - 对 ThreadPoolExecutor 内的各个线程设置超时

java - 如何让多个线程使用同一个socket读写?

c# - 修改 IQueryable.Include() 的表达式树,为 join 添加条件

c# - "System.Web.HttpContext cannot be serialized because it does not have a parameterless constructor."