私のAndroidアプリは、HttpClientを介してHttpリクエストを実行する必要があります。
エミュレータでテストしましたが、正常に動作します。しかし、WIFIがアクティブになっている実際のデバイスでそれを行うと、ANRが発生することがあり、SocketExceptionがスローされることがあります。
デバイスがサーバーに接続できないようです。
logcatのプリントアウトは次のとおりです
また、アプリのパッケージ名は「com.tim.wirelessorder」です。
06-03 09:51:17.803: W/System.err(2307): java.net.SocketException: The operation timed out
06-03 09:51:17.803: W/System.err(2307): at org.apache.harmony.luni.platform.OSNetworkSystem.connectStreamWithTimeoutSocketImpl(Native Method)
06-03 09:51:17.803: W/System.err(2307): at org.apache.harmony.luni.platform.OSNetworkSystem.connect(OSNetworkSystem.java:115)
06-03 09:51:17.803: W/System.err(2307): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:244)
06-03 09:51:17.803: W/System.err(2307): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:533)
06-03 09:51:17.803: W/System.err(2307): at java.net.Socket.connect(Socket.java:1055)
06-03 09:51:17.803: W/System.err(2307): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
06-03 09:51:17.803: W/System.err(2307): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:143)
06-03 09:51:17.803: W/System.err(2307): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
06-03 09:51:17.803: W/System.err(2307): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
06-03 09:51:17.803: W/System.err(2307): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:348)
06-03 09:51:17.803: W/System.err(2307): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
06-03 09:51:17.803: W/System.err(2307): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
06-03 09:51:17.803: W/System.err(2307): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
06-03 09:51:17.803: W/System.err(2307): at com.tim.wirelessorder.util.net.HttpUtil.getHttpResponse(HttpUtil.java:43)
06-03 09:51:17.803: W/System.err(2307): at com.tim.wirelessorder.ui.SignIn$BnListener.onClick(SignIn.java:117)
06-03 09:51:17.803: W/System.err(2307): at android.view.View.performClick(View.java:2408)
06-03 09:51:17.803: W/System.err(2307): at android.view.View$PerformClick.run(View.java:8818)
06-03 09:51:17.803: W/System.err(2307): at android.os.Handler.handleCallback(Handler.java:587)
06-03 09:51:17.803: W/System.err(2307): at android.os.Handler.dispatchMessage(Handler.java:92)
06-03 09:51:17.803: W/System.err(2307): at android.os.Looper.loop(Looper.java:123)
06-03 09:51:17.810: W/System.err(2307): at android.app.ActivityThread.main(ActivityThread.java:4627)
06-03 09:51:17.810: W/System.err(2307): at java.lang.reflect.Method.invokeNative(Native Method)
06-03 09:51:17.810: W/System.err(2307): at java.lang.reflect.Method.invoke(Method.java:521)
06-03 09:51:17.810: W/System.err(2307): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-03 09:51:17.810: W/System.err(2307): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-03 09:51:17.810: W/System.err(2307): at dalvik.system.NativeStart.main(Native Method)
06-03 09:51:28.289: W/KeyCharacterMap(2307): Can't open keycharmap file
06-03 09:51:28.289: W/KeyCharacterMap(2307): Error loading keycharmap file '/system/usr/keychars/ilitek_ts.kcm.bin'. hw.keyboards.65538.devname='ilitek_ts'
06-03 09:51:28.289: W/KeyCharacterMap(2307): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
私はエミュレーターでしか実行できないアプリを開発していないので、この問題は本当に厄介です。それは意味がありません。どんな赤ちゃんも問題が何であるかを理解できますか?
私のコードはここにあります。
HttpPost request = HttpUtil.getHttpPost(url);
List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>();
BasicNameValuePair vName = new BasicNameValuePair(
"name", name);
list.add(vName);
BasicNameValuePair vPwd = new BasicNameValuePair("pwd",
pwd);
list.add(vPwd);
// Log.e("result", "kk:");
request.setEntity(new UrlEncodedFormEntity(list));
HttpResponse response = HttpUtil
.getHttpResponse(request);
// -------- the line above throws the SocketException. this is a static method. the code is added below.
======
public static HttpGet getHttpGet(String url) {
Log.e("url", url);
HttpGet request = new HttpGet(url);
return request;
}
public static HttpPost getHttpPost(String url) {
HttpPost request = new HttpPost(url);
return request;
}
public static HttpResponse getHttpResponse(HttpGet request)
throws ClientProtocolException, IOException {
// Log.e("http", "in ");
HttpResponse response = new DefaultHttpClient().execute(request);
// Log.e("http", (response == null) + " ");
return response;
}
public static HttpResponse getHttpResponse(HttpPost request)
throws ClientProtocolException, IOException {
HttpResponse response = new DefaultHttpClient().execute(request);
// ------- and here it performs a HttpPost request, and it seems the request fails to be sent.
return response;
}
これはサーバー上のdo-postコードです。サーブレットはリクエストを受信し、UIでユーザーが入力したクライアントから名前pwdパラメーターを取得します。次に、サーブレットは、名前pwdを使用してMySQLでクエリを実行するDAOをアクティブにします。サーブレットがリクエストを取得するかどうかを確認したい「System.out.println(name)」行が表示されます。実際のデバイスでコードをテストすると、コンソールから印刷されません。これは、サーブレットがリクエストを受信しないことを意味すると思います。
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
OutputStream out = response.getOutputStream();
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
System.out.println(name);
UserDao dao = new UserDaoImpl();
byte[] r = dao.query(name, pwd);
out.write(r);
out.close();
}