在我的应用程序中具有“同步”数据之类的功能,在同步操作中,从服务器获取数据并将其存储在本地sqlite数据库中,然后将本地数据推送到服务器。当用户单击同步时,场景将冻结以完成推和拉操作。我如何摆脱这个问题。我试图像使用单独的线程来执行数据库操作一样,但是我遇到了类似持久性数据库操作仅在主线程上起作用的异常。如何在不冻结屏幕的情况下进行同步操作。请提出任何想法,谢谢。
这是我尝试过的示例代码
var thread = new System.Threading.Thread(() =>
{
//do sqlite operations
});
thread.start();
答案 0 :(得分:2)
您应该在另一个线程中执行昂贵的查询。查询返回后,您可以在主Thread
中使用结果。我注意到您尝试使用Thread
,但收到新错误:
get_persistentDataPath只能从主线程中调用。
这是因为您在另一个Application.persistentDataPath
中使用了Thread
。您不能在另一个Thread
中使用大多数Unity API,而Application.persistentDataPath
是其中之一。这是一个简单的修复。没有理由在另一个线程中使用Application.persistentDataPath
。获取Application.persistentDataPath
的值并存储在全局string
中,然后在新线程中使用该全局变量。
例如:
请勿执行此操作(这是您当前正在执行的操作):
void Start()
{
//This Start function is the main Thread (Unity's Thread)
var thread = new System.Threading.Thread(() =>
{
//This is another Thread created by you
//DO NOT DO THIS(Don't use Unity API in another Thread)
string dbPath = Application.persistentDataPath;
//do sqlite operations
});
thread.Start();
}
代替(在主线程中获取Application.persistentDataPath
的变量,然后使用存储的值)
void Start()
{
//This Start function is the main Thread (Unity's Thread)
//Get path in the Main Thread
string dbPath = Application.persistentDataPath;
var thread = new System.Threading.Thread(() =>
{
//This is another Thread created by you
//Use the path result here
//do sqlite operations
});
thread.Start();
}
最后,如果您真的需要使用Application.persistentDataPath
以外的其他Unity API,或者例如,使用数据库中的结果更新UI Text组件,则可以使用我的UnityThread
插件来简化操作
public Text yourTextComponent;
void Start()
{
UnityThread.initUnityThread();
//This Start function is the main Thread (Unity's Thread)
//Get path in the Main Thread
string dbPath = Application.persistentDataPath;
var thread = new System.Threading.Thread(() =>
{
//This is another Thread created by you
//do sqlite operations
//Show result on UI
UnityThread.executeInUpdate(() =>
{
yourTextComponent.text = queryResult;
});
});
thread.Start();
}