我应该如何编码这个广播接收器来检查互联网并根据它执行操作

How should I code this Broadcast receiver to check for internet and perform actions based on that

我正在检查 Internet 连接,如果可用则调用方法,否则显示警告对话框。

我调用的方法使用 volley 从 Internet 获取数据,所以我在调用 onResponse 之前给它循环 ProgressDialog。 在 onResponsese 中,我关闭了进度对话框。

现在的问题是,从调用 getData 到调用 onResponse 与互联网连接之间 继续,ProgressDialog 不会停止加载。换句话说,即使没有希望获取数据,它也会一直显示。

所以我想在互联网连接断开时再次显示 alertDialogBuilder,并在它仍在显示时关闭 mProgressDialog

我认为这可以通过广播接收器来完成,所以我创建了一个并在 activity 中注册了它,但这是我所能得到的。

这是我的代码:

网络检查

public class NetworkCheck {
//I use this class to check for internet connectivity.

    public static boolean isAvailableAndConnected(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        boolean isNetworkAvailable = cm.getActiveNetworkInfo() != null;
        boolean isNetWorkConnected = isNetworkAvailable && cm.getActiveNetworkInfo().isConnected();

        return isNetWorkConnected;

    }

}

InternetReciever

public class InternetReciever extends BroadcastReceiver {
    public InternetReciever() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

MainActivity

public class MainActivity extends AppCompatActivity {

    private final String TAG = "MainActivity";

    //Creating a list of fruits
    private List<FruitItems> mFruitItemsList;

    //Creating Views
    private RecyclerView recyclerView;
    private RecyclerView.Adapter adapter;
    private ProgressDialog mProgressDialog;

    private int number = 2;

    public int getNumber() {
        return number++;
    }

    public void setNumber(int number) {
        this.number = number;
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        //The usual codes in onCreate are I here

          if (savedInstanceState != null && savedInstanceState.containsKey(KEY_FRUIT_ITEMS)) {
              mFruitItemsList = savedInstanceState.getParcelableArrayList(KEY_FRUIT_ITEMS);

          } else {

              //Initializing the fruitlist
              mFruitItemsList = new ArrayList<>();

              if (NetworkCheck.isAvailableAndConnected(this)) {

              getData();

              } else {
            final Context mContext;
            mContext = this;
            final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
            alertDialogBuilder.setTitle(R.string.alert_titl);
            alertDialogBuilder.setCancelable(false);
            alertDialogBuilder.setIcon(R.mipmap.ic_launcher);
            alertDialogBuilder.setMessage(R.string.alert_mess);
            alertDialogBuilder.setPositiveButton(R.string.alert_retry, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (!NetworkCheck.isAvailableAndConnected(mContext)) {
                        alertDialogBuilder.show();
                    } else {
                        getData();
                    }

                }
            });
            alertDialogBuilder.setNegativeButton(R.string.alert_cancel, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();

                }
            });
            alertDialogBuilder.show();

        }
          }

        //Registering Receivers
        IntentFilter intentFilter = new IntentFilter();
        InternetReciever internetReciever = new InternetReciever();
        registerReceiver(internetReciever, intentFilter);
    }


    //This method will get data from the web api

    private void getData(){


        Log.d(TAG, "getData called");
        //Showing progress dialog
        mProgressDialog = new ProgressDialog(MainActivity.this);
        mProgressDialog.setCancelable(false);
        mProgressDialog.setMessage(this.getResources().getString(R.string.load_fruit));
        mProgressDialog.show();


        //Creating a json request
        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(ConfigFruit.GET_URL,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d(TAG, "onResponse called");
                        //Dismissing the progress dialog
                        if (mProgressDialog != null) {
                            mProgressDialog.hide();
                        }



                        //calling method to parse json array
                        parseData(response);

                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                });

        //Creating request queue
        RequestQueue requestQueue = Volley.newRequestQueue(this);

        //Adding request to the queue
        requestQueue.add(jsonArrayRequest);

    }

    //The method that parses json data is here
}

而且我也在考虑这个问题:在调用onResponse之前解散mProgressDialog时不应该取消截击请求吗?

试试这个:

 public class NetworkChangeReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(final Context context, final Intent intent) {
            isNetworkAvailable(context);

        }

        private boolean isNetworkAvailable(Context context) {
            ConnectivityManager connectivity = (ConnectivityManager)                 context.getSystemService(Context.CONNECTIVITY_SERVICE);
          
            if (connectivity != null) {
                NetworkInfo[] info = connectivity.getAllNetworkInfo();
                if (info != null) {
                    for (int i = 0; i < info.length; i++) {
                        if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                          
                            if (!isConnected) {
                                Log.v(MAIN_TAG,
                                        "Now you are connected to Internet!");
             
                            }
                            return true;
                        }
                    }
                }
            }
            //  Toast.makeText(getApplicationContext(), "not connected", Toast.LENGTH_LONG).show();

            Log.v(MAIN_TAG, "You are not connected to Internet!");

            return false;
        }
    }

因为在调用 getData 到调用 onResponse 之间你不会有互联网 volley 方法

new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {

                 if (mProgressDialog != null) {
                        mProgressDialog.hide();
                    }

                }
            });

将被调用。您可以在此处显示警报。显示对数据的调用失败并关闭你的进度条。

The reason after Response.ErrorListener being called is : Its the default error handling provided by Volley. So we better use the default functionality provided :)