2

我的应用程序在很多场合都会发出 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();   
            }

        }
4

1 回答 1

1

单独检查Airplane mode可能不是一个好主意,因为您可以在飞行模式下打开 wifi。但是对此可能有一些可能的答案,但我所做的是注册一个BroadcastReceiver具有以下权限的监听网络状态更改的

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

我的接收器在清单中看起来像这样

<receiver android:name="com.example.NetworkReceiver" >
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
    </receiver>

当它被触发时,我检查是否有网络连接,并保持一个应用程序范围的布尔值SharedPreferences,我每次在进行 HTTP 调用之前检查该布尔值。

我发现这仍然无法完全解决您的问题的情况,例如SocketTimeOutExceptions用户接收不良和连接超时的情况。

于 2013-09-07T00:49:47.493 回答