我的应用程序在很多场合都会发出 HTTP 发布请求。我在测试过程中发现,如果用户在发出此请求时处于飞行模式,应用程序就会崩溃。因此,为了优雅地处理这种情况,我调用了一个函数,在拨打电话之前立即测试手机是否处于飞行模式AsyncTask
。如果函数返回 true,我就不AsyncTask
打电话了。
测试本身正常工作。通知用户他们必须关闭飞行模式,然后他们回来再试一次。问题是,关闭飞行模式并AsyncTask
继续运行后,我的 HTTP 帖子使应用程序崩溃。如果一开始就没有开启飞行模式,一切都会顺利进行。
我不知道该怎么办。首先有没有更好的方法来测试飞行模式?AsyncTask
或者在阻止恢复系统状态以使http请求成功之后,我还需要做些什么。
任何建议表示赞赏。这是一些代码,希望能更清楚地说明这一点。如果有其他代码有帮助,请告诉我。谢谢!
public class LoginActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
context = this;
btnLogin.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
UserFunctions userFunction = new UserFunctions(context);
if (userFunction.isAirplaneModeOn(context)) {
userFunction.warnAboutAirplaneMode(context);
return;
}
new Login().execute();
});
}
class Login extends AsyncTask<String, String, String> {
private JSONParser jsonParser = new JSONParser();
private JSONObject json;
@Override
protected String doInBackground(String... args) {
String URL = context.getResources().getString(R.string.dbURL) + context.getResources().getString(R.string.attemptLogin_php);
//this next line is the one that crashes - iff the user was
// previously in airplane mode. If there weren't ever in airplane
// mode, this runs just fine
json = jsonParser.makeHttpRequest(URL, params);
...
}
}
这是 UserFunctions 类:
public class UserFunctions {
@SuppressLint( "NewApi" )
@SuppressWarnings("deprecation")
public boolean isAirplaneModeOn(Context context) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
return Settings.Global.getInt(context.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
} else {
return Settings.System.getInt(context.getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, 0) != 0;
}
}
public void warnAboutAirplaneMode(Context context) {
AlertDialog.Builder builder = new AlertDialog.Builder(context)
.setTitle("Airplane Mode Is On")
.setIcon(R.raw.airplane_mode)
.setCancelable(false)
.setMessage("Your phone is in airplane mode. Please turn this off then try again.")
.setNeutralButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
}