0

ayntask.doInBackgroud で http 接続 (HttpClient.execute を使用) を実行しています。httpサーバーが稼働していない場合、Androidアプリが「後でもう一度やり直してください」などの適切な情報をユーザーに表示することを期待しています。ただし、例外をキャッチしようとすると、アプリが直接クラッシュします。状況についてユーザーにプロンプ​​トを表示する機会はありません。

以下にログを添付しましたが、

07-13 03:50:51.605: E/Util.java, function sendPost(1137): IOException encountered.
07-13 03:50:51.605: W/System.err(1137): org.apache.http.NoHttpResponseException: The target server failed to respond
07-13 03:50:51.605: W/System.err(1137):     at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:85)
07-13 03:50:51.605: W/System.err(1137):     at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174)
07-13 03:50:51.605: W/System.err(1137):     at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:179)
07-13 03:50:51.605: W/System.err(1137):     at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235)
07-13 03:50:51.605: W/System.err(1137):     at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259)
07-13 03:50:51.605: W/System.err(1137):     at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279)
07-13 03:50:51.615: W/System.err(1137):     at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121)
07-13 03:50:51.615: W/System.err(1137):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:410)
07-13 03:50:51.624: W/System.err(1137):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
07-13 03:50:51.624: W/System.err(1137):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
07-13 03:50:51.624: W/System.err(1137):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
07-13 03:50:51.624: W/System.err(1137):     at game.location.Util.sendPost(Util.java:27)
07-13 03:50:51.624: W/System.err(1137):     at game.location.LoginForm$LoginTask.doInBackground(LoginForm.java:73)
07-13 03:50:51.624: W/System.err(1137):     at game.location.LoginForm$LoginTask.doInBackground(LoginForm.java:1)
07-13 03:50:51.634: W/System.err(1137):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
07-13 03:50:51.634: W/System.err(1137):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-13 03:50:51.634: W/System.err(1137):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-13 03:50:51.664: W/System.err(1137):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
07-13 03:50:51.664: W/System.err(1137):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
07-13 03:50:51.664: W/System.err(1137):     at java.lang.Thread.run(Thread.java:1096)
07-13 03:50:51.664: W/dalvikvm(1137): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
07-13 03:50:51.694: E/AndroidRuntime(1137): FATAL EXCEPTION: AsyncTask #1
07-13 03:50:51.694: E/AndroidRuntime(1137): java.lang.RuntimeException: An error occured while executing doInBackground()
07-13 03:50:51.694: E/AndroidRuntime(1137):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
07-13 03:50:51.694: E/AndroidRuntime(1137):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
07-13 03:50:51.694: E/AndroidRuntime(1137):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
07-13 03:50:51.694: E/AndroidRuntime(1137):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
07-13 03:50:51.694: E/AndroidRuntime(1137):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-13 03:50:51.694: E/AndroidRuntime(1137):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
07-13 03:50:51.694: E/AndroidRuntime(1137):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
07-13 03:50:51.694: E/AndroidRuntime(1137):     at java.lang.Thread.run(Thread.java:1096)
07-13 03:50:51.694: E/AndroidRuntime(1137): Caused by: java.lang.NullPointerException
07-13 03:50:51.694: E/AndroidRuntime(1137):     at game.location.Util.sendPost(Util.java:37)
07-13 03:50:51.694: E/AndroidRuntime(1137):     at game.location.LoginForm$LoginTask.doInBackground(LoginForm.java:73)
07-13 03:50:51.694: E/AndroidRuntime(1137):     at game.location.LoginForm$LoginTask.doInBackground(LoginForm.java:1)
07-13 03:50:51.694: E/AndroidRuntime(1137):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
07-13 03:50:51.694: E/AndroidRuntime(1137):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-13 03:50:51.694: E/AndroidRuntime(1137):     ... 4 more
07-13 03:50:51.943: W/IInputConnectionWrapper(1137): showStatusIcon on inactive InputConnection
07-13 03:50:53.114: E/WindowManager(1137): Activity game.location.LoginForm has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44f5cbf0 that was originally added here
07-13 03:50:53.114: E/WindowManager(1137): android.view.WindowLeaked: Activity game.location.LoginForm has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44f5cbf0 that was originally added here
07-13 03:50:53.114: E/WindowManager(1137):  at android.view.ViewRoot.<init>(ViewRoot.java:247)
07-13 03:50:53.114: E/WindowManager(1137):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
07-13 03:50:53.114: E/WindowManager(1137):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
07-13 03:50:53.114: E/WindowManager(1137):  at android.view.Window$LocalWindowManager.addView(Window.java:424)
07-13 03:50:53.114: E/WindowManager(1137):  at android.app.Dialog.show(Dialog.java:241)
07-13 03:50:53.114: E/WindowManager(1137):  at game.location.AbstractActivity.showProgressDialog(AbstractActivity.java:39)
07-13 03:50:53.114: E/WindowManager(1137):  at game.location.LoginForm$1.onClick(LoginForm.java:43)
07-13 03:50:53.114: E/WindowManager(1137):  at android.view.View.performClick(View.java:2408)
07-13 03:50:53.114: E/WindowManager(1137):  at android.view.View$PerformClick.run(View.java:8816)
07-13 03:50:53.114: E/WindowManager(1137):  at android.os.Handler.handleCallback(Handler.java:587)
07-13 03:50:53.114: E/WindowManager(1137):  at android.os.Handler.dispatchMessage(Handler.java:92)
07-13 03:50:53.114: E/WindowManager(1137):  at android.os.Looper.loop(Looper.java:123)
07-13 03:50:53.114: E/WindowManager(1137):  at android.app.ActivityThread.main(ActivityThread.java:4627)
07-13 03:50:53.114: E/WindowManager(1137):  at java.lang.reflect.Method.invokeNative(Native Method)
07-13 03:50:53.114: E/WindowManager(1137):  at java.lang.reflect.Method.invoke(Method.java:521)
07-13 03:50:53.114: E/WindowManager(1137):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-13 03:50:53.114: E/WindowManager(1137):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-13 03:50:53.114: E/WindowManager(1137):  at dalvik.system.NativeStart.main(Native Method)

doInBackGround のコード:

protected String doInBackground(String... arg0) {

            HttpPost httpPost = new HttpPost(Global.Url.LOGIN.getLink());
            String result = "";

            List<NameValuePair> pair = new ArrayList<NameValuePair>();
            pair.add(new BasicNameValuePair("userName", arg0[0]));
            pair.add(new BasicNameValuePair("password", arg0[1]));
            try {
                httpPost.setEntity(new UrlEncodedFormEntity(pair));

            } catch (UnsupportedEncodingException e) {

                e.printStackTrace();
            }
            result = Util.sendPost(httpPost).toString();


            return result;
        }

必要なすべての例外キャッチを配置したコード。正確なエラーは次のとおりです。

public static StringBuilder sendPost(HttpPost httpPost){
        HttpClient httpClient = new DefaultHttpClient();
        HttpResponse response = null;
        StringBuilder result = null;

        try {
            response = httpClient.execute(httpPost);

        } catch (ClientProtocolException e) {
            Log.e("Util.java, function sendPost", "ClientProtocolException encountered.");
            e.printStackTrace();
        } catch (IOException e) {
            Log.e("Util.java, function sendPost", "IOException encountered.");
            e.printStackTrace();
        }
        try {
            result = inputStreamToString(response.getEntity().getContent());
        } catch (IllegalStateException e) {
            Log.e("Util.java, function sendPost", "IllegalStateException encountered.");
            e.printStackTrace();
        } catch (IOException e) {
            Log.e("Util.java, function sendPost", "IOException encountered.");
            e.printStackTrace();
        }

        return result;
    }

助けてくれてありがとう。


public static StringBuilder sendPost(HttpPost httpPost){
        StringEntity se = null;
        try {
            se = new StringEntity("envelope",HTTP.UTF_8);
        } catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } 
        httpPost.setEntity(se); 



        HttpClient httpClient = new DefaultHttpClient();
        HttpResponse response = null;
        StringBuilder result = null;

        final HttpParams httpParameters = httpClient.getParams();  
        HttpConnectionParams.setConnectionTimeout(httpParameters, 3 * 1000); 
        HttpConnectionParams.setSoTimeout(httpParameters, 3 * 1000); 



        try {
            response = httpClient.execute(httpPost);

        } catch (ClientProtocolException e) {
            Log.e("Util.java, function sendPost", "ClientProtocolException encountered.");
            e.printStackTrace();
        } catch (IOException e) {
            Log.e("Util.java, function sendPost", "IOException encountered.");
            e.printStackTrace();
        } catch (Exception e){

        }

        try {
            result = inputStreamToString(response.getEntity().getContent());
        } catch (IllegalStateException e) {
            Log.e("Util.java, function sendPost", "IllegalStateException encountered.");
            e.printStackTrace();
        } catch (IOException e) {
            Log.e("Util.java, function sendPost", "IOException encountered.");
            e.printStackTrace();
        }

        return result;
    }

こんにちは @ user370305 関数をこのように変更しましたが、まだ機能していません。

4

1 に答える 1

1

HttpPostリクエストでパラメータをSocketTimeOut設定します。ConnectionTimeout

お気に入り、

HttpPost httpPost = new HttpPost(url);
StringEntity se = new StringEntity(envelope,HTTP.UTF_8);
httpPost.setEntity(se);

HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
int timeoutConnection = 3000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT) 
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 3000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
BasicHttpResponse httpResponse = (BasicHttpResponse)  httpClient.execute(httpPost);

HttpEntity entity = httpResponse.getEntity();

また

のを使用するだけHttpConnectionParamsですDefaultHttpClient

final HttpParams httpParameters = yourHttpClient.getParams();

HttpConnectionParams.setConnectionTimeout(httpParameters, connectionTimeOutSec * 1000);
HttpConnectionParams.setSoTimeout(httpParameters, socketTimeoutSec * 1000);
于 2012-07-13T08:44:34.883 に答える