2015-01-13 55 views
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; 
} 

回答

0

此問題是由robovm插件的安裝遭到破壞而引起的。重新安裝修復問題