0

アプリにログインページがあり、サーバーがあります。タブを他のワイヤレス接続に接続するように設定してログインボタンをクリックすると、「ホストへのルートがありません」というエラーが出力され、クラッシュします。しかし、サーバーに接続すると、完全に正常に機能します。ログイン時に間違ったサーバーに接続するたびにプロンプ​​トを表示したい。

これが私のコードです...しかし、これをどこに置くべきかわかりません..plsヘルプ。

        AlertDialog.Builder builder = new AlertDialog.Builder(LoginPage.this);
        builder.setTitle("Attention!");
        builder.setMessage("Connection to Server failed.");
        builder.setPositiveButton("Retry", new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int which) {
                new phpRequest().execute();

        }
        });
        builder.setNegativeButton("Cancel", null);

        AlertDialog dialog = builder.create();
        dialog.show();

これが私のphpRequestです。

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

    @Override
    protected String doInBackground(String... params) 
    {

        String responseString = "";

        HttpClient httpclient = new DefaultHttpClient();
        HttpPost request = new HttpPost(myurl);

        try
        {    
            String studSt = etStudNo.getText().toString();
            String passSt = etPassword.getText().toString();

            List<NameValuePair> parameter = new ArrayList<NameValuePair>();
            parameter.add(new BasicNameValuePair("student_id", studSt));
            parameter.add(new BasicNameValuePair("password", passSt));

            request.setEntity(new UrlEncodedFormEntity(parameter));

            HttpResponse response = httpclient.execute(request);
            StatusLine statusLine = response.getStatusLine(); 



            if(statusLine.getStatusCode() == HttpStatus.SC_OK)
            {
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                response.getEntity().writeTo(out);
                out.close();
                responseString = out.toString();                       
            }
            else
            {

                response.getEntity().getContent().close();
                throw new IOException(statusLine.getReasonPhrase());
            }

        }
        catch (Exception ioe)
        {

            Log.e("Error", ioe.toString());
        }



        return responseString;
    }

     @Override
     protected void onPostExecute(String result) 
     {      
         super.onPostExecute(result);
         String c = result;
         int check = Integer.parseInt(c);

         if (check == 1)
         {
             Intent i = new Intent(LoginPage.this,HomePage.class);
             startActivity(i); 

             globalVars globalVars = (globalVars)getApplicationContext();

                String idnumber = etStudNo.getText().toString();
                globalVars.setStudLoggedId(idnumber);               

             Toast.makeText(getBaseContext(), "Student No: "+etStudNo.getText().toString(),Toast.LENGTH_LONG).show();
         }
         else
         {
             etPassword.setText("");
             Toast.makeText(getBaseContext(), "Login Failed", Toast.LENGTH_LONG).show(); 
         }
     }
}    
4

1 に答える 1

0

問題はここから始まります:

HttpResponse response = httpclient.execute(request);

IOExceptionこれは、サーバーに接続してリクエストを完了できない場合にをスローするためです。

次に、ここで例外をキャッチします。

catch (Exception ioe)
{
    Log.e("Error", ioe.toString());
}

関数は続行responseStringされますが、HTTP応答ではなく、最初に割り当てた空の文字列 ""が含まれています(完了しなかったため)。

これは、空の文字列 ""が返され、に渡されることを意味しますonPostExecute(String result)。ここで失敗し、アプリをクラッシュさせている可能性のあるInteger.parseInt(c)をスローします。NumberFormatException

簡単な解決策は次のとおりです。

  1. の例外ハンドラ内でdoInBackground()、エラーをログに記録した後return null、メソッドが失敗したことを示す必要があります。
  2. 次に、内部onPostExecute(String result)で、結果がnull他のことを行う前にあるかどうかを確認します。そうである場合は、リクエストが失敗したことがわかり、エラーを説明するダイアログボックスを安全にポップアップできます。

Eclipseにいくつかのブレークポイントを設定すると、これを自分で追跡して正しく理解できます。

お役に立てば幸いです。

于 2012-12-11T23:06:18.637 に答える