Unity调用Android的注意事项——UI线程

写在前面的异常

JNI DETECTED ERROR IN APPLICATION: use of deleted local reference 0x200001

具体红字如截图,一百米长的报错,截取片段。

图1 异常报错片段

问题场景描述

在我们的应用中,需要对后台数据进行处理,并针对异常情况数据上报。为了缩短开发周期,将数据上报的功能交给客户端处理。

有一种异常是我们在后台做数据校验时,发现MD5数据为空,然后进行数据上报。


问题解析

注意上文“后台”两字是粗体,问题原因就出于此。

MD5校验是一个高IO操作,不能发在UI线程进行处理,否则会出现卡顿的问题。

Unity提供了BackgroundWorker异步线程,可以将高消耗操作放在改线程中进行处理。

{

          BackgroundWorker worker =new BackgroundWorker();  

          worker.WorkerReportsProgress =true;  

           worker.DoWork += BackgroundDoWork;  

           worker.ProgressChanged += BackgroundProgressChanged;  

           worker.RunWorkerAsync();

}

我们的数据异常上报就是在BackgroundDoWork的异步线程中执行的 。

而Unity调用原生的方法:

AndroidJavaClass javaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");

必须在UI线程中执行,这点官方并没有明确的说明,而iOS系统并没有该问题。

由于不开源,笔者只能对问题原因进行猜测:可能是com.unity3d.player.UnityPlayer类似于上下文(Context),

在当前线程中没有发现可以使用的类,导致创建Android对象失败。


解决方案

数据上报放在UI线程中调用原生方法即可。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容