![](/img/trans.png)
[英]Under what circumstances can Java's HttpURLConnection.connect() throw a ConnectionException?
[英]libgdx iOS httpUrlConnection.connect throw IllegalMonitorStateException
我有一個Libgdx游戲,可以在android上正常運行,但是當我在iOS上運行它(libgdx 1.5.2和robovm 1.0.0-beta-2)時,嘗試從Facebook下載頭像圖像時出現問題。 我使用Facebook API請求URL。
代碼(下面提供)在“ 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;
}
此問題是由robovm插件的安裝損壞引起的。 重新安裝解決了該問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.