0
我有一個Libgdx遊戲在Android上運行正常,但當我在iOS上運行它(libgdx 1.5.2和robovm 1.0.0-beta-2)時,我嘗試下載來自Facebook的頭像圖片。我使用facebook api請求URL。libgdx iOS httpUrlConnection.connect throw IllegalMonitorStateException
代碼(在下面提供)在「syncDownloadPixmapFromURL()」函數中的「conn.connect()」上崩潰。 我在做什麼錯?
編輯:難道是在某個地方HttpConnection已經存在和某些東西(例如某些fb請求?)嘗試從另一個線程在新線程中運行時使用它?
我收到以下錯誤信息:
2015-01-13 19:27:14.949 IOSLauncher[531:112238] [info] imagemanager: connecting
java.lang.IllegalMonitorStateException: unlock of unowned monitor
java.lang.IllegalMonitorStateException: unlock of unowned monitor
at com.android.okhttp.Connection.upgradeToTls(Connection.java)
at com.android.okhttp.Connection.connect(Connection.java)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java)
at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java)
at com.android.okhttp.internal.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java)
at bla.helpers.ImageManager.syncDownloadPixmapFromURL(ImageManager.java)
at bla.helpers.ImageManager.access$1(ImageManager.java)
at bla.helpers.ImageManager$2.run(ImageManager.java)
at java.lang.Thread.run(Thread.java)
at com.android.okhttp.Connection.upgradeToTls(Connection.java)
at com.android.okhttp.Connection.connect(Connection.java)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java)
at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java)
at com.android.okhttp.internal.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java)
at bla.helpers.ImageManager.syncDownloadPixmapFromURL(ImageManager.java)
at bla.helpers.ImageManager.access$1(ImageManager.java)
at bla.helpers.ImageManager$2.run(ImageManager.java)
at java.lang.Thread.run(Thread.java)
[WARN] android.System: A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
[WARN] android.System: java.lang.Throwable: Explicit termination method 'close' not called
at dalvik.system.CloseGuard.open(CloseGuard.java)
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java)
at com.android.okhttp.Connection.upgradeToTls(Connection.java)
at com.android.okhttp.Connection.connect(Connection.java)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java)
at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java)
at com.android.okhttp.internal.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java)
at bla.helpers.ImageManager.syncDownloadPixmapFromURL(ImageManager.java)
at bla.helpers.ImageManager.access$1(ImageManager.java)
at bla.helpers.ImageManager$2.run(ImageManager.java)
at java.lang.Thread.run(Thread.java)
Cannot detach thread when there are non native frames on the call stack
代碼:
protected void asyncDownloadTextureFromURL(final URL url, final FileHandle image, final boolean round)
{
if(beingDownloaded.contains(url.toString()))
return;
if(threadAmount>=MAX_THREAD_AMOUNT)
return;
threadAmount++;
new Thread(new Runnable()
{
@Override
public void run()
{
beingDownloaded.add(url.toString());
Gdx.app.log("imagemanager", "Downloading started: "+url.toString());
Pixmap pixmap = syncDownloadPixmapFromURL(url);
if(image.exists()) image.delete();
if(pixmap==null)
{
beingDownloaded.remove(url.toString());
threadAmount--;
return;
}
Pixmap to_save = null;
OutputStream stream = image.write(false);
try
{
/**
*TO GET PNG ENCODER CLASS FOLLOW TO: http://pastebin.com/psF60D8Q
**/
to_save = pixmap;
if(round)
{
to_save = PNG.RoundPixmap(pixmap);
pixmap.dispose();
}
byte[] bytes = PNG.toPNG(to_save);
stream.write(bytes);
stream.close();
Gdx.app.log("imagemanager", "Downloading stopped: "+url.toString());
if(!downloaded.contains(url.toString()))
{
downloaded.add(url.toString());
long downloaded_date = new Date().getTime();
download_dates.add(downloaded_date);
}
beingDownloaded.remove(url.toString());
if(image.exists())
Gdx.app.log("imagemanager","saved file: " + image.toString());
else
Gdx.app.log("imagemanager", "error saving file: " + image.toString());
}
catch (IOException e)
{
Gdx.app.log("imagemanager", "error saving file: " + image.toString());
}
finally
{
if(to_save != null)
to_save.dispose();
threadAmount--;
}
}
}).start();
}
private Pixmap syncDownloadPixmapFromURL(URL url)
{
Gdx.app.log("imagemanager", "sync Downloading started");
try
{
Gdx.app.log("imagemanager", "create connection");
HttpURLConnection conn= (HttpURLConnection)url.openConnection();
conn.setDoInput(true);
Gdx.app.log("imagemanager", "connecting");
conn.connect();
int length = conn.getContentLength();
if(length<=0)
return null;
Gdx.app.log("imagemanager", "get input stream");
InputStream is = conn.getInputStream();
DataInputStream dis = new DataInputStream(is);
byte[] data = new byte[length];
Gdx.app.log("imagemanager", "read fully");
dis.readFully(data);
Gdx.app.log("imagemanager", "Create pixmap");
Pixmap pixmap = new Pixmap(data, 0, data.length);
pixmap = ImagePow2.isPow2(pixmap)?pixmap:ImagePow2.getPow2Pixmap(pixmap);
return pixmap;
}
catch (MalformedURLException e)
{
Gdx.app.log("imagemanager", "Error in sync download: wrong url");
}
catch (IOException e)
{
Gdx.app.log("imagemanager", "Error in sync download: io exception");
}
return null;
}