Java libgdx-robovm在调用堆栈上具有非本机帧的detatch线程上崩溃
我已经断断续续地尝试修复这个崩溃好几个星期了,但我还没有发现问题。当我在Libgdx游戏中运行以下函数GetAchievementsInformation时,当调用堆栈上存在非本机帧时,应用程序会崩溃,线程无法分离 我做错什么了吗?我的大多数其他facebook请求都运行得很好,我还有一个请求给出了相同的错误Java libgdx-robovm在调用堆栈上具有非本机帧的detatch线程上崩溃,java,ios,facebook,libgdx,robovm,Java,Ios,Facebook,Libgdx,Robovm,我已经断断续续地尝试修复这个崩溃好几个星期了,但我还没有发现问题。当我在Libgdx游戏中运行以下函数GetAchievementsInformation时,当调用堆栈上存在非本机帧时,应用程序会崩溃,线程无法分离 我做错什么了吗?我的大多数其他facebook请求都运行得很好,我还有一个请求给出了相同的错误 public FBRequest GetAchievementsRequest() { return new FBRequest(FBSession.getActiveSessi
public FBRequest GetAchievementsRequest()
{
return new FBRequest(FBSession.getActiveSession(),"/"+ APP_ID + "/achievements", null,"GET");
}
FBRequestHandler GetAchievementsRequestHandler()
{
return new FBRequestHandler()
{
@Override
public void invoke(FBRequestConnection connection, NSObject data, NSError error)
{
if (error != null)
{
Gdx.app.log("error", error.toString());
logout();
return;
}
JSONArray achievements_data;
try {
achievements_data = NSObjectToJSONObject(data).getJSONArray("data");
for(int i=0;i<achievements_data.length();i++)
{
JSONObject achievement_data = achievements_data.getJSONObject(i);
JSONObject pointdata = achievement_data.getJSONObject("data");
String points_data = pointdata.get("points").toString();
int score = Integer.parseInt(points_data);
String url = achievement_data.get("url").toString();
JSONArray list = achievement_data.getJSONArray("image");
String image_url = list.getJSONObject(0).get("url").toString();
achievementManager.AddInformationToAchievement(url, score,image_url);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Gdx.app.log("request", "get achieved achievements");
GetAchievedAchievementsRequest().start(GetAchievedAchievementRequestHandler());
}
};
}
public FBRequest GetAchievedAchievementsRequest()
{
return new FBRequest(FBSession.getActiveSession(),"/me/achievements", null, "GET");
}
FBRequestHandler GetAchievedAchievementRequestHandler()
{
return new FBRequestHandler()
{
@Override
public void invoke(FBRequestConnection connection, NSObject data,NSError error)
{
if (error != null)
{
Gdx.app.log("error", error.toString());
logout();
return;
}
JSONArray achievements_data;
try
{
achievements_data = NSObjectToJSONObject(data).getJSONArray("data");
for(int i=0;i<achievements_data.length();i++)
{
JSONObject achievement_data = achievements_data.getJSONObject(i).getJSONObject("data");
JSONObject achievement_sub_data = achievement_data.getJSONObject("achievement");
String url = achievement_sub_data.get("url").toString();
achievementManager.UnlockedAchievement(url);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
achievementManager.SetupAchievementsFinished(); //finished loading after this
}
};
}
public void GetAchievementInformation()
{
Gdx.app.log("request", "Getting achievement information");
GetAchievementsRequest().start(GetAchievementsRequestHandler());
}
JSONObject NSObjectToJSONObject(NSObject object)
{
JSONObject json = null;
String jsonString64 = NSJSONSerialization.createJSONData(object, NSJSONWritingOptions.PrettyPrinted).toBase64EncodedString(NSDataBase64EncodingOptions.None);
String jsonString = Base64Coder.decodeString(jsonString64);
Gdx.app.log("json", "to json:" + jsonString);
try {
json = new JSONObject(jsonString);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return json;
}
这是一个内存泄漏,通过添加:connection.dispose
我不知道为什么这不是我的其他请求的问题。但在这里,它导致了坠机 这个错误发生在哪一行?每次都会发生吗?因为我有一个相当慢的macbook,我不能运行调试器,因为每次连接之前调试器都会超时。使用调试行,我发现问题出在:GetAchievementsRequest.startGetAchievementsRequestHandler;有趣的是,当我写出这些函数时,问题并不是在这里出现的,而是在后来的一个请求中出现的。如果我发现了问题所在,我将进一步调查并更新问题/答案。这可能只是随机的,太好了,不可能是真的。这一错误发生的时间似乎有一些随机性。但是不管我怎么做,当我运行这个请求时,错误发生在完成请求后的某个点上。如果我不运行请求,它就不会发生。无论如何,在错误发生之前,我不会对成就信息做任何事情。