2016-03-04 22 views
1

我有我的GameActivity,這是一個簡單的測驗。我設置了兩個Runnables,mRunnableQuestionmRunnableQuestionWithPenalty。其中的邏輯是:mRunnableQuestion顯示新的問題,並等待30秒,當用戶沒有在這個時候接聽電話,其他可運行被調用,這給用戶分的處罰:BufferedInputStream在設置postDelayed Runnable時關閉

private Runnable mRunnableQuestion = new Runnable() { 
    @Override 
    public void run() { 
     new AsyncAPIGetQuestion().execute(mCategoryId); 
     mHandler.postDelayed(mRunnableQuestionWithPenalty, 30000); 
    } 
}; 

當然,在時間用戶回答,我給用戶點並重新啓動Runnable:

mHandler.removeCallbacksAndMessages(null); 
mHandler.post(mRunnableQuestion); 

它工作得很好。但是,我想根據正確/錯誤的答案對卡片着色並等待5秒鐘。所以我把上面的代碼改爲:

mHandler.removeCallbacksAndMessages(null); 
colorAnswers(); 
mHandler.postDelayed(mRunnableQuestion, 5000); 

這是問題開始的地方。當我運行我的應用程序,經過2,3或4個問題,我得到一個EOF /的BufferedInputStream錯誤:

03-04 13:38:24.107 16506-16532/com.my.pkg W/System.err: java.io.EOFException 
    03-04 13:38:24.107 16506-16532/com.my.pkg W/System.err:  at com.android.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:95) 
    03-04 13:38:24.107 16506-16532/com.my.pkg W/System.err:  at com. 
    android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:175) 
    03-04 13:38:24.107 16506-16532/com.my.pkg W/System.err:  at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:101) 
    03-04 13:38:24.107 16506-16532/com.my.pkg W/System.err:  at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:616) 
    03-04 13:38:24.107 16506-16532/com.my.pkg W/System.err:  at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:379) 
    03-04 13:38:24.107 16506-16532/com.my.pkg W/System.err:  at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:323) 
    03-04 13:38:24.108 16506-16532/com.my.pkg W/System.err:  at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:190) 
    03-04 13:38:24.108 16506-16532/com.my.pkg W/System.err:  at com.my.pkg.JSONParser.getJSONFromUrl(JSONParser.java:45) 
    03-04 13:38:24.108 16506-16532/com.my.pkg W/System.err:  at com.my.pkg.GameActivity$AsyncAPIGetQuestion.doInBackground(GameActivity.java:317) 
    03-04 13:38:24.108 16506-16532/com.my.pkg W/System.err:  at com.my.pkg.GameActivity$AsyncAPIGetQuestion.doInBackground(GameActivity.java:299) 
    03-04 13:38:24.108 16506-16532/com.my.pkg W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:288) 
    03-04 13:38:24.108 16506-16532/com.my.pkg W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    03-04 13:38:24.108 16506-16532/com.my.pkg W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
    03-04 13:38:24.108 16506-16532/com.my.pkg W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
    03-04 13:38:24.108 16506-16532/com.my.pkg W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
    03-04 13:38:24.108 16506-16532/com.my.pkg W/System.err:  at java.lang.Thread.run(Thread.java:818) 
    03-04 13:38:24.108 16506-16532/com.my.pkg E/JSONParser.java: Error converting result java.io.IOException: BufferedInputStream is closed 

時纔會發生,當我添加額外的postDelayed()那裏。之前沒有問題。的AsyncTask的

我doInBackground部分由Runnable接口並執行並返回一個錯誤上面

@Override 
    protected JSONArray doInBackground(String... params) { 
     JSONParser jParser = new JSONParser(); 
     JSONArray json = jParser.getJSONFromUrl(apiURL); 
     return json; 
    } 

如規定JSONParser.getJSONFromURL

public JSONArray getJSONFromUrl(String urlSource) { 
    try { 
     URL url = new URL(urlSource); 
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
     urlConnection.setDoOutput(true); 
     urlConnection.setChunkedStreamingMode(0); 
     inputStream = new BufferedInputStream(urlConnection.getInputStream()); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "iso-8859-1"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
      if(!reader.ready()) { 
       break; 
      } 
     } 
     inputStream.close(); 
     json = sb.toString(); 
    } catch (Exception e) { 
     Log.e(TAG, "Error converting result " + e.toString()); 
    } 

    try { 
     jArr = new JSONArray(json); 
    } catch (JSONException e) { 
     Log.e(TAG, "Error parsing data " + e.toString()); 
    } 

    return jArr; 
} 

我真的很感激任何幫助。祝一切順利!

回答

0

看起來我解決了這個問題。

的問題是在我的jParser.getJSONFromUrl()方法,特別是這些行:

URL url = new URL(urlSource); 
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
urlConnection.setDoOutput(true); 

看來你設置setDoOutput參數爲true,當您使用POST/PUT請求。如果你想只執行一個GET請求,如在我的情況下,你應該設置爲假

urlConnection.setDoOutput(false); 

否則,你可以最終得到的錯誤,如上所述。

向社區致意!

相關問題