如何在android中无法连接到互联网时放置对话框?

时间:2012-12-11 15:30:39

标签: java android httpresponse

我的应用程序中有一个登录页面,我有一台服务器。每当我将我的标签设置为连接到其他无线连接并单击登录按钮时,它会输出错误“无路由到主机”并崩溃。但是,如果我连接到我的服务器它完全正常。我想在登录时连接到错误的服务器时提示。

这是我的代码...但我不知道该放在哪里..请帮助。

        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(); 
         }
     }
}    

1 个答案:

答案 0 :(得分: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。如果是,您知道请求失败,您可以安全地弹出一个描述错误的对话框。
  3. 如果你在Eclipse中加入一些断点,你可以自己跟踪它并正确理解它。

    希望有所帮助!