1

デバイスがインターネットに接続されていない場合、Toast でインターネット接続エラーが発生するはずです。しかし、アプリケーションがクラッシュします。No Internet Connection のエラーをキャッチしません。私のコードはインターネット接続で完全に動作します。私を助けてください

private class MyAsyncTask extends AsyncTask<String, Integer, String>{


        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub
            String s=postData();
            return s;
        }

        protected void onPostExecute(String result){
            pb.setVisibility(View.GONE);
            Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show();
        }
        protected void onProgressUpdate(Integer... progress){
            pb.setProgress(progress[0]);
        }

        public String postData() {
            // Create a new HttpClient and Post Header


            String origresponseText="";
            try {
                  DefaultHttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://localhost/ServletParams/AndroidServlet");

                // Add your data  cnic,mobileNo,name,address,nextkin
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                nameValuePairs.add(new BasicNameValuePair("param1",cnic));
                nameValuePairs.add(new BasicNameValuePair("param2", mobileNo));
                nameValuePairs.add(new BasicNameValuePair("param3", name));
                nameValuePairs.add(new BasicNameValuePair("param4", address));
                nameValuePairs.add(new BasicNameValuePair("param5", nextkin));
                nameValuePairs.add(new BasicNameValuePair("param6", sendImages));


                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
         /* execute */

                HttpResponse response = httpclient.execute(httppost);
                  HttpEntity rp = response.getEntity();
origresponseText=readContent(response);

            } 
      catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
          Toast.makeText(getBaseContext(), "No Internet Connection", Toast.LENGTH_SHORT).show();
            } 
      catch (IOException e) {
                // TODO Auto-generated catch block
          Toast.makeText(getBaseContext(), "sorry", Toast.LENGTH_SHORT).show();
            }
            String responseText = origresponseText.substring(7, origresponseText.length());
            return responseText;

        }


    }
    String readContent(HttpResponse response)
    {
        String text = "";
        InputStream in =null;

        try {
            in = response.getEntity().getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                  sb.append(line);
                }
                text = sb.toString();
        } catch (IllegalStateException e) {
            Toast.makeText(getBaseContext(), "sorry", Toast.LENGTH_SHORT).show();

        } catch (IOException e) {
            Toast.makeText(getBaseContext(), "Sorry", Toast.LENGTH_SHORT).show();
        }
        finally {
            try {

              in.close();
            } catch (Exception ex) {
                Toast.makeText(getBaseContext(), "Sorry", Toast.LENGTH_SHORT).show();
            }
            }

return text;
    }

ログは次のとおりです。

10-17 19:45:05.061: E/AndroidRuntime(22597): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
10-17 19:45:05.061: E/AndroidRuntime(22597):    at android.os.Handler.<init>(Handler.java:121)
10-17 19:45:05.061: E/AndroidRuntime(22597):    at android.widget.Toast$TN.<init>(Toast.java:322)
10-17 19:45:05.061: E/AndroidRuntime(22597):    at android.widget.Toast.<init>(Toast.java:91)
10-17 19:45:05.061: E/AndroidRuntime(22597):    at android.widget.Toast.makeText(Toast.java:238)
10-17 19:45:05.061: E/AndroidRuntime(22597):    at com.example.androidufoneapp.CustomerRegistrationL0$MyAsyncTask.postData(CustomerRegistrationL0.java:647)
10-17 19:45:05.061: E/AndroidRuntime(22597):    at com.example.androidufoneapp.CustomerRegistrationL0$MyAsyncTask.doInBackground(CustomerRegistrationL0.java:602)
10-17 19:45:05.061: E/AndroidRuntime(22597):    at com.example.androidufoneapp.CustomerRegistrationL0$MyAsyncTask.doInBackground(CustomerRegistrationL0.java:1)
10-17 19:45:05.061: E/AndroidRuntime(22597):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
10-17 19:45:05.061: E/AndroidRuntime(22597):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-17 19:45:05.061: E/AndroidRuntime(22597):    ... 4 more
4

4 に答える 4

2

インターネット接続がない場合、コードが doInBackground メソッドで UI スレッドにアクセスしているため、ウィンドウ リークが発生したと思います。ReadContent メソッドでトースト メッセージを見てください。インターネットがなく、例外が発生した場合、トースト メッセージは UI スレッドにアクセスします。ただし、アプリがその時点でバックグラウンド スレッドにあるため、アプリ UI にアクセスできないため、ウィンドウ リーク エラーが発生し、アプリがクラッシュします。バックグラウンド スレッド。

OK..これを修正するには、Toast メッセージを PostData メソッドから削除します。トーストを表示したい場合は、onPostExecute メソッドで表示します。別の良い方法を提案します。

このメソッドを使用して、次のメソッドを使用して接続が利用可能かどうかを確認します

public boolean isOnline() {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        if (netInfo != null && netInfo.isConnectedOrConnecting()
                && cm.getActiveNetworkInfo().isAvailable()
                && cm.getActiveNetworkInfo().isConnected()) {
            return true;
        }
        return false;
    }

次に、 AsyncTask を開始するときに、次のようにします

if(isOnline()){
   // Start your AsyncTask
} else{
  // Show internet not available alert
}

このメソッドを使用するには、ACCESS_NETWORK_STATE パーミッションも追加する必要があります。それが役に立てば幸い。

于 2013-10-17T15:02:57.443 に答える
0

問題は、Toast.makeTextによって呼び出されるメソッド内で呼び出していることですdoInBackground。このメソッドは、 内で禁止されている UI スレッドに触れています。クエリの結果に従って、からdoInBackground呼び出す必要があります。Toast.makeTextonPostExecute

あなたはこれを行うことができます:

protected void onPostExecute(String result){
    if (!result.equals("")){ // Check to see if String result contains a result or in case or error, is still your empty String you assigned it
        pb.setVisibility(View.GONE);
        Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show();
    }else{
        Toast.makeText(getApplicationContext(), errorMessage, Toast.LENGTH_LONG).show();
        // errorMessage can be a String that you keep track of inside your catch clauses or a generic error message
    }
}

Toast.makeTextまた、メソッド内の catch 句からすべての呼び出しを削除する必要がありますreadContent

さらに、AsyncTask を起動する前にインターネット接続を確認し、AsyncTask コード内でのみ IO エラーなどを処理することをお勧めします。Ayonのソリューションはそのために機能します。

于 2013-10-17T15:09:46.577 に答える
0

次のように、トーストをメインの UI スレッド内に配置する必要があります。

runOnUiThread(new Runnable() {
    public void run() {
        // runs on UI thread
          Toast.makeText(getBaseContext(), "No Internet Connection", Toast.LENGTH_SHORT).show();

    }
});

両方をこのように置くと、問題は解決します! ;)

于 2013-10-17T15:10:35.847 に答える