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

2018-04-27  本文已影响0人  StemonZhang

写在前面的异常

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线程中调用原生方法即可。

上一篇 下一篇

猜你喜欢

热点阅读