我应该如何编码这个广播接收器来检查互联网并根据它执行操作
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 :)
我正在检查 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 :)