【问题标题】:FATAL EXCEPTION AsyncTask致命异常异步任务
【发布时间】:2014-05-06 14:16:49
【问题描述】:

在我的应用程序中,我在我的 webview 中使用超链接与 shouldOverrideUrlLoading(WebView view, String url) 来触发异步函数...如果用户只按一次链接,它就可以正常工作...但是如果用户单击多次链接(允许用户在应用程序中多次单击链接)我的应用程序关闭“不幸的是,您的应用程序已停止”,并且我的 logcat 中出现以下错误:

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

这是我的 webview 的 shouldOverrideUrlLoading:

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

那么这是我的异步:

 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) {
    }
}

他们是否可以解决我在使用多个异步时遇到的这个问题?

【问题讨论】:

  • 当用户点击几次会发生什么?
  • 它会在我的 logcat 中抛出此页面顶部的错误并关闭我的应用程序,并显示此消息“不幸的是,您的应用程序已停止。”

标签: android webview android-asynctask


【解决方案1】:

问题是你一次又一次地从一个静态类连接到同一个函数/网络..

发生了什么..假设您当前正在通过静态类方法执行网络操作,然后用户再次单击将创建另一个网络操作的链接..现在第一个网络操作连接仍然打开去,但你想执行另一个连接,这将导致

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

您需要做的是每次您想要进行网络操作时创建该类的一个新实例..并将结果传递给onPostExecute,您将在其中添加结果..

【讨论】:

  • 这很有道理...我对“创建该类的新实例”有点困惑?我将如何处理?
  • @user2423476 在 doInbackground 中创建一个新的 NetworkOperations 实例...假设 NetworkOperations no = new NetworkOperations(); no.add(url2, "", "");
【解决方案2】:

我会做以下事情。使按钮在 onProgressUpdate(...) 中不可点击,并在 onPostExecute(...) 中使其返回可点击

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

然后在 onPostExecute(...) 中让它返回可点击

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

【讨论】:

    猜你喜欢
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 2021-07-05
    相关资源
    最近更新 更多