我的 HttpUrlConnection 尝试写入然后读取时出错
Error with my HttpUrlConnection trying to Write then Read
这是保存我的 HttpURLConnection 的地方。我正在尝试将 username/password 发送到我的 php 控件,returns 结果是 true/false。
然而,当我添加 Buffered Reader 时,我一遍又一遍地收到相同的错误。
看过thispost,还是没看懂。有人可以解释为什么这不起作用吗?
方法:
public boolean checkLogin(String username, String password){
boolean is_Correct = false;
try {
URL url = new URL(this.url);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
BufferedWriter output = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(),"UTF-8"));
output.write("func=Login");
output.write("username="+username);
output.write("password="+password);
BufferedReader input = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
String result = input.readLine();
output.flush();
output.close();
}catch(Exception e){
e.printStackTrace();
}
return is_Correct;
}
错误:
09-19 12:25:27.408 3913-3913/com.project.backgroundprocesstest W/System.err: android.os.NetworkOnMainThreadException
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at java.net.InetAddress.lookupHostByName(InetAddress.java:436)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at java.net.InetAddress.getAllByName(InetAddress.java:215)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.Network.resolveInetAddresses(Network.java:29)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:399)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:379)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:369)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:287)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:130)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:261)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.project.backgroundprocesstest.HttpConnect$override.checkLogin(HttpConnect.java:38)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.project.backgroundprocesstest.HttpConnect$override.access$dispatch(HttpConnect.java)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.project.backgroundprocesstest.HttpConnect.checkLogin(HttpConnect.java:0)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.project.backgroundprocesstest.LoginControl.checkLogin(LoginControl.java:13)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.project.backgroundprocesstest.MainActivity$override.onClick(MainActivity.java:52)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at com.project.backgroundprocesstest.MainActivity$override.access$dispatch(MainActivity.java)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at com.project.backgroundprocesstest.MainActivity.onClick(MainActivity.java:0)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at android.view.View.performClick(View.java:5210)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at android.view.View$PerformClick.run(View.java:21328)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at android.os.Handler.handleCallback(Handler.java:739)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at android.os.Looper.loop(Looper.java:148)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5551)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at java.lang.reflect.Method.invoke(Native Method)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest
如前所述,您需要使用 asynctask。在该异步任务中,您还可以通过将参数放入 HashMap 并使用如下方法来改善与 php 的通信:
public String performPostCall(String requestURL, HashMap<String, String> postDataParams)
{
String response = "Network Error.";
// Log.i(TAG, "performpostcall was run!! yay!");
try
{
URL url = new URL(requestURL);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setReadTimeout(8000);
conn.setConnectTimeout(8000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
writer.write(getPostDataString(postDataParams));
// Log.i(TAG, "getPostDataString() returned " + getPostDataString(postDataParams));
writer.flush();
writer.close();
os.close();
int responseCode = conn.getResponseCode();
if (responseCode == 200)
{
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
response = response + line;
}
}
else
{
response = "response code: " + responseCode;
}
conn.disconnect();
}
catch (Exception e)
{
// This should never happen. :)
}
return response;
}
和...
private String getPostDataString(HashMap<String, String> params)
throws UnsupportedEncodingException
{
StringBuilder result = new StringBuilder();
boolean first = true;
// Log.i(TAG, "get PostDataString was run!! yay!");
for (Map.Entry<String, String> entry : params.entrySet())
{
if (first) {
first = false;
} else {
result.append("&");
}
result.append(URLEncoder.encode((String)entry.getKey(), "UTF-8"));
result.append("=");
result.append(URLEncoder.encode((String)entry.getValue(), "UTF-8"));
}
return result.toString();
}
通过这种方式,您可以控制超时、轻松设置参数,并获得有关任何错误原因的更多详细信息。
这是保存我的 HttpURLConnection 的地方。我正在尝试将 username/password 发送到我的 php 控件,returns 结果是 true/false。
然而,当我添加 Buffered Reader 时,我一遍又一遍地收到相同的错误。
看过thispost,还是没看懂。有人可以解释为什么这不起作用吗?
方法:
public boolean checkLogin(String username, String password){
boolean is_Correct = false;
try {
URL url = new URL(this.url);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
BufferedWriter output = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(),"UTF-8"));
output.write("func=Login");
output.write("username="+username);
output.write("password="+password);
BufferedReader input = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
String result = input.readLine();
output.flush();
output.close();
}catch(Exception e){
e.printStackTrace();
}
return is_Correct;
}
错误:
09-19 12:25:27.408 3913-3913/com.project.backgroundprocesstest W/System.err: android.os.NetworkOnMainThreadException
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at java.net.InetAddress.lookupHostByName(InetAddress.java:436)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at java.net.InetAddress.getAllByName(InetAddress.java:215)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.Network.resolveInetAddresses(Network.java:29)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:399)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:379)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:369)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:287)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:130)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:261)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.project.backgroundprocesstest.HttpConnect$override.checkLogin(HttpConnect.java:38)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.project.backgroundprocesstest.HttpConnect$override.access$dispatch(HttpConnect.java)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.project.backgroundprocesstest.HttpConnect.checkLogin(HttpConnect.java:0)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.project.backgroundprocesstest.LoginControl.checkLogin(LoginControl.java:13)
09-19 12:25:27.410 3913-3913/com.project.backgroundprocesstest W/System.err: at com.project.backgroundprocesstest.MainActivity$override.onClick(MainActivity.java:52)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at com.project.backgroundprocesstest.MainActivity$override.access$dispatch(MainActivity.java)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at com.project.backgroundprocesstest.MainActivity.onClick(MainActivity.java:0)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at android.view.View.performClick(View.java:5210)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at android.view.View$PerformClick.run(View.java:21328)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at android.os.Handler.handleCallback(Handler.java:739)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at android.os.Looper.loop(Looper.java:148)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5551)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at java.lang.reflect.Method.invoke(Native Method)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
09-19 12:25:27.411 3913-3913/com.project.backgroundprocesstest
如前所述,您需要使用 asynctask。在该异步任务中,您还可以通过将参数放入 HashMap 并使用如下方法来改善与 php 的通信:
public String performPostCall(String requestURL, HashMap<String, String> postDataParams)
{
String response = "Network Error.";
// Log.i(TAG, "performpostcall was run!! yay!");
try
{
URL url = new URL(requestURL);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setReadTimeout(8000);
conn.setConnectTimeout(8000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
writer.write(getPostDataString(postDataParams));
// Log.i(TAG, "getPostDataString() returned " + getPostDataString(postDataParams));
writer.flush();
writer.close();
os.close();
int responseCode = conn.getResponseCode();
if (responseCode == 200)
{
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
response = response + line;
}
}
else
{
response = "response code: " + responseCode;
}
conn.disconnect();
}
catch (Exception e)
{
// This should never happen. :)
}
return response;
}
和...
private String getPostDataString(HashMap<String, String> params)
throws UnsupportedEncodingException
{
StringBuilder result = new StringBuilder();
boolean first = true;
// Log.i(TAG, "get PostDataString was run!! yay!");
for (Map.Entry<String, String> entry : params.entrySet())
{
if (first) {
first = false;
} else {
result.append("&");
}
result.append(URLEncoder.encode((String)entry.getKey(), "UTF-8"));
result.append("=");
result.append(URLEncoder.encode((String)entry.getValue(), "UTF-8"));
}
return result.toString();
}
通过这种方式,您可以控制超时、轻松设置参数,并获得有关任何错误原因的更多详细信息。