写在前面的异常
JNI DETECTED ERROR IN APPLICATION: use of deleted local reference 0x200001
具体红字如截图,一百米长的报错,截取片段。
问题场景描述
在我们的应用中,需要对后台数据进行处理,并针对异常情况数据上报。为了缩短开发周期,将数据上报的功能交给客户端处理。
有一种异常是我们在后台做数据校验时,发现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线程中调用原生方法即可。