【问题标题】:Issue with Http Url Connection on android throw java.lang.IllegalStateException: Already connectedandroid throw java.lang.IllegalStateException 上的 Http Url Connection 问题:已连接
【发布时间】:2016-06-17 00:27:17
【问题描述】:

大家好,我正在开发一些应用程序,它与 Web 服务建立 Http 连接,以检查服务器中的用户名和密码。 当我登录时总是抛出 java.lang.IllegalStateException: 已经连接了这个异常并且它从今天开始,昨天它工作得很好 这是我的连接代码:

String username = params[0];
        String password = params[1];
        String res="";
        HttpURLConnection urlConnection=null;
        String urllogin=getResources().getString(R.string.AppLogin);
        Content="phone_no="+URLEncoder.encode(username)+"&pass="+URLEncoder.encode(password);




        try{
            URL url=new URL(urllogin);
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setDoOutput(true);
            urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            urlConnection.setRequestProperty("Connection","close");
            urlConnection.setRequestProperty("Content-Length", String.valueOf(Content.getBytes().length));
            urlConnection.setRequestMethod("POST");
            urlConnection.setChunkedStreamingMode(0);
            OutputStream outputStream=new BufferedOutputStream(urlConnection.getOutputStream());
            outputStream.write(Content.getBytes());

            if(urlConnection.getResponseCode()==HttpURLConnection.HTTP_OK)
            {
                InputStream in = new BufferedInputStream(urlConnection.getInputStream());
                res = readStream(in);
            }
            if(urlConnection.getResponseCode()!=HttpURLConnection.HTTP_OK)
            {
                InputStream in = new BufferedInputStream(urlConnection.getErrorStream());
                res = readStream(in);
            }

抛出异常时的日志或错误:

03-03 17:18:52.831 19012-19012/? E/View:hasTransientState 递减到 0 以下:setHasTransientState 调用对不匹配 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:致命异常:AsyncTask #1 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:进程:com.mycompany.logintoapp,PID:19012 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime: java.lang.RuntimeException: 执行 doInBackground() 时出错 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:在 android.os.AsyncTask$3.done(AsyncTask.java:300) 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:在 java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:在 java.util.concurrent.FutureTask.setException(FutureTask.java:222) 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:在 java.util.concurrent.FutureTask.run(FutureTask.java:242) 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:在 java.lang.Thread.run(Thread.java:818) 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime: 引起: java.lang.IllegalStateException: 已经连接 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:在 java.net.URLConnection.checkNotConnected(URLConnection.java:463) 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:在 java.net.URLConnection.setDoOutput(URLConnection.java:877) 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:在 com.mycompany.logintoapp.MainActivity$ValidateLogin.doInBackground(MainActivity.java:275) 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:在 com.mycompany.logintoapp.MainActivity$ValidateLogin.doInBackground(MainActivity.java:225) 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:在 android.os.AsyncTask$2.call(AsyncTask.java:288) 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:在 java.util.concurrent.FutureTask.run(FutureTask.java:237) 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 03-03 17:19:27.607 19012-20724/? E/AndroidRuntime:在 java.lang.Thread.run(Thread.java:818) 03-03 17:19:27.619 19012-19012/? E/CliptrayUtils: hideClipTrayIfNeeded() TextView 被聚焦!!隐藏剪辑托盘() 03-03 17:19:27.628 19012-19012/? E/CliptrayUtils: hideClipTrayIfNeeded() TextView 被聚焦!! hideClipTray()

我不明白昨天是什么问题

编辑: 异常总是抛出这个行

urlConnection.setDoOutput(true);
        urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        urlConnection.setRequestProperty("Connection","close");
        urlConnection.setRequestProperty("Content-Length", String.valueOf(Content.getBytes().length));

EDIT2:现在我在发帖时总是缺少参数,但奇怪的是它只在 LG g3 5.0 中

【问题讨论】:

  • 我在用 PHP 编写的 REST API 服务器上遇到了类似的问题,但也只有 LG G3 和 5.0...了解正在发生的事情。

标签: java android multithreading android-intent android-asynctask


【解决方案1】:

仅供参考,您只需要一个 if 语句和一个 else。并且只需在每个子句中指定您需要的 BufferedInputStream。然后进行之后的设置。这样,您只需检查一次响应代码。不确定这是否是您的问题,但它肯定会对您有所帮助,以确保您只做一次又一次。更容易调试问题。

InputStream inputStream;
if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
    inputStream = urlConnection.getInputStream();
} else {
    inputStream = urlConnection.getErrorStream();
}

InputStream in = new BufferedInputStream(inputStream);
res = readStream(in);

并确保关闭所有流、连接等,为下次调用做好准备。

【讨论】:

    【解决方案2】:

    根据this 问题,此异常可能具有误导性并隐藏了错误URL 的问题。我建议您验证您的远程服务器是否按预期运行,并且您尝试连接的 URL 确实可以访问。

    【讨论】:

      猜你喜欢
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 2020-03-27
      • 2015-06-06
      • 2019-07-17
      • 1970-01-01
      相关资源
      最近更新 更多