0

我的应用程序中有一个登录页面,并且我有一个服务器。每当我将选项卡设置为连接到其他无线连接并单击登录按钮时,它都会输出错误“无路由到主机”并崩溃。但是,如果我连接到我的服务器,它工作得很好。每当我在登录时连接到错误的服务器时,我都想发出提示。

这是我的代码......但我不知道把它放在哪里......请帮忙。

        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), whereInteger.parseInt(c)将失败并抛出 a NumberFormatException,这可能是导致您的应用程序崩溃的原因。

一个简单的解决方案是:

  1. 在异常处理程序中doInBackground(),在记录错误后,您应该return null指示方法失败。
  2. 然后在里面onPostExecute(String result),检查结果是否null在做其他事情之前。如果是,您知道请求失败,您可以安全地弹出一个描述错误的对话框。

如果您在 Eclipse 中设置了一些断点,您可以自己遵循并正确理解它。

希望有帮助!

于 2012-12-11T23:06:18.637 回答