android throw java.lang.IllegalStateException 上的 Http Url Connection 问题:已连接

Posted

技术标签:

【中文标题】android throw java.lang.IllegalStateException 上的 Http Url Connection 问题:已连接【英文标题】:Issue with Http Url Connection on android throw java.lang.IllegalStateException: Already connected 【发布时间】: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...了解正在发生的事情。 【参考方案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 确实可以访问。

【讨论】:

以上是关于android throw java.lang.IllegalStateException 上的 Http Url Connection 问题:已连接的主要内容,如果未能解决你的问题,请参考以下文章

Phonegap/Cordova build android node_modules/q/q.js throw e;

android throw java.lang.IllegalStateException 上的 Http Url Connection 问题:已连接

Android Studio 查看源码出现throw new RuntimeException("Stub!"); 解决办法

Android throw DeadObjectException with LOG: Transaction failed on small parcel;远程进程可能已经死了

event.js:174 throw er// 未处理的“错误”事件操作不允许

错误记录Visual Studio 中编译 NDK 报错 ( error : cannot use ‘throw‘ with exceptions disabled )