我的应用程序中有一个登录页面,我有一台服务器。每当我将我的标签设置为连接到其他无线连接并单击登录按钮时,它会输出错误“无路由到主机”并崩溃。但是,如果我连接到我的服务器它完全正常。我想在登录时连接到错误的服务器时提示。
这是我的代码...但我不知道该放在哪里..请帮助。
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();
}
}
}
答案 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
,这可能会导致您的应用崩溃。
一个简单的解决方案是:
doInBackground()
中的异常处理程序内部,在记录错误后,您应该return null
以指示方法失败。onPostExecute(String result)
内,在执行任何其他操作之前检查结果是否为null
。如果是,您知道请求失败,您可以安全地弹出一个描述错误的对话框。如果你在Eclipse中加入一些断点,你可以自己跟踪它并正确理解它。
希望有所帮助!