簡體   English   中英

libgdx iOS httpUrlConnection.connect拋出IllegalMonitorStateException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM