2014-05-06 34 views
0

在我的應用程序即時使用我的webview中的超鏈接與shouldOverrideUrlLoading(WebView視圖,字符串url)來觸發一個異步函數......它工作正常,如果用戶只按一次鏈接......但如果用戶點擊鏈接多次(允許用戶在應用內的多次點擊鏈接),我的應用程序關閉「抱歉,系統的程序已經停止」,我得到了下面的錯誤在我的logcat:致命的例外AsyncTask

05-05 19:28:08.920: E/AndroidRuntime(6983): FATAL EXCEPTION: AsyncTask #3 
05-05 19:28:08.920: E/AndroidRuntime(6983): Process: com.soto.splash, PID: 6983 
05-05 19:28:08.920: E/AndroidRuntime(6983): java.lang.RuntimeException: An error occured while executing doInBackground() 
05-05 19:28:08.920: E/AndroidRuntime(6983):  at android.os.AsyncTask$3.done(AsyncTask.java:300) 
05-05 19:28:08.920: E/AndroidRuntime(6983):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
05-05 19:28:08.920: E/AndroidRuntime(6983):  at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
05-05 19:28:08.920: E/AndroidRuntime(6983):  at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
05-05 19:28:08.920: E/AndroidRuntime(6983):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
05-05 19:28:08.920: E/AndroidRuntime(6983):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
05-05 19:28:08.920: E/AndroidRuntime(6983):  at java.lang.Thread.run(Thread.java:864) 
05-05 19:28:08.920: E/AndroidRuntime(6983): Caused by: java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated. 
05-05 19:28:08.920: E/AndroidRuntime(6983): Make sure to release the connection before allocating another one. 
05-05 19:28:08.920: E/AndroidRuntime(6983):  at ch.boye.httpclientandroidlib.impl.conn.BasicClientConnectionManager.getConnection(BasicClientConnectionManager.java:161) 
05-05 19:28:08.920: E/AndroidRuntime(6983):  at ch.boye.httpclientandroidlib.impl.conn.BasicClientConnectionManager$1.getConnection(BasicClientConnectionManager.java:138) 
05-05 19:28:08.920: E/AndroidRuntime(6983):  at ch.boye.httpclientandroidlib.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:455) 
05-05 19:28:08.920: E/AndroidRuntime(6983):  at ch.boye.httpclientandroidlib.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:902) 
05-05 19:28:08.920: E/AndroidRuntime(6983):  at ch.boye.httpclientandroidlib.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:801) 
05-05 19:28:08.920: E/AndroidRuntime(6983):  at ch.boye.httpclientandroidlib.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:780) 
05-05 19:28:08.920: E/AndroidRuntime(6983):  at com.soto.splash.network.NetworkOperations.addlike(NetworkOperations.java:681) 
05-05 19:28:08.920: E/AndroidRuntime(6983):  at com.soto.splash.Gallery$LongOperation.doInBackground(Gallery.java:648) 
05-05 19:28:08.920: E/AndroidRuntime(6983):  at  com.soto.splash.Gallery$LongOperation.doInBackground(Gallery.java:1) 
05-05 19:28:08.920: E/AndroidRuntime(6983):  at android.os.AsyncTask$2.call(AsyncTask.java:288) 
05-05 19:28:08.920: E/AndroidRuntime(6983):  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
05-05 19:28:08.920: E/AndroidRuntime(6983):  ... 3 more 

這是我的應用OverrideUrl負載爲webview:

 @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) 
     { 
      if (url.endsWith("&photo")) 
      { 
     new LongOperation().execute(""); 
       return true; 
       } 
     } 

然後thi s是我的異步:

private class LongOperation extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... params) { 
     NetworkOperations.add(url2, "", ""); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
    } 

    @Override 
    protected void onPreExecute() { 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
    } 
} 

是他們的解決方案來解決這個問題我與多個Asyncs?

+0

以及當用戶多次點擊它會發生什麼? –

+0

它在我的logcat引發這個頁面頂部的錯誤,並關閉我的應用程序給我這個消息「不幸的是,你的應用程序已停止。」 – user2423476

回答

0

的問題是,你一次又一次地連接到從一個靜態類相同的功能/網絡..

發生什麼事是..讓說你正在通過靜態類方法執行網絡操作又一次的用戶點擊,這將創造另一個網絡操作的鏈接..現在對當時的第一個網絡操作連接仍在繼續,但要執行另一個連接,這將導致對

connection still allocated. 
05-05 19:28:08.920: E/AndroidRuntime(6983): Make sure to release the connection before allocating another one. 

你需要什麼do是每次你想做一個網絡操作時創建一個新類的實例將結果傳遞給onPostExecute,您可以在其中添加結果..

+0

這是有道理的...我有點混淆「創建該類的新實例」?我將如何處理這個問題? – user2423476

+0

@ user2423476在doInbackground中只是創建一個NetworkOperations的新實例...可以說NetworkOperations no = new NetworkOperations(); no.add(url2,「」,「」); –

0

我會執行以下操作。使按鈕在onProgressUpdate(....)不clickeable並使其在onPostExecute回clickeable(...)

protected void onProgressUpdate(Integer... progress) { 
    <your_button>.setClickable(false); 
} 

然後使其在onPostExecute(...)回可點擊

protected void onPostExecute(Long result) { 
    <your_button>.setClickable(true); 
}