BroadcastReceiver 仅触发第二次
BroadcastReceiver fires only second time
我正在通过 ping 来检查 Internet 连接 google.If 没有网络或响应不成功 我发送了一个广播,其中包含没有 Internet 的消息。每当我在导航抽屉中单击 Textview 时,它必须检查是否有互联网 connection.Whenever 没有互联网并且我单击未检查的 textview,仅在第二次单击 Textview.The onReceive 方法时检查BroadcastReceiver的不是第一次调用。
代码如下:
public void checkInternetConnection()
{
connectivityManager=(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
networkInfo=connectivityManager.getActiveNetworkInfo();
try {
if (networkInfo!=null)
{
if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE || networkInfo.getType() == ConnectivityManager.TYPE_WIFI)
{
OkHttpClient okHttpClient = new OkHttpClient.Builder().
connectTimeout(30, TimeUnit.SECONDS).
writeTimeout(30, TimeUnit.SECONDS).
readTimeout(30, TimeUnit.SECONDS).build();
Request request = new Request.Builder().url(googleurl).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e("error", "error");
e.printStackTrace();
hasInternet1 = false;
Intent intent=new Intent("itrnt_avl");
intent.putExtra("inernet_availability",false);
sendBroadcast(intent);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.e("Response", response.body().string());
if (response.isSuccessful()) {
hasInternet1 = true;
Intent intent=new Intent("itrnt_avl");
intent.putExtra("inernet_availability",true);
sendBroadcast(intent);
} else {
Log.e("Response", "No response");
hasInternet1 = false;
Intent intent=new Intent("itrnt_avl");
intent.putExtra("inernet_availability",false);
sendBroadcast(intent);
throw new IOException("Unexpected code " + response.body().string());
}
}
});
}
else
{
hasInternet1 = false;
Log.e("Response", "No network type");
Intent intent=new Intent("itrnt_avl");
intent.putExtra("inernet_availability",false);
sendBroadcast(intent);
}
}
else {
hasInternet1=false;
Log.e("Response", "network null");
Intent intent=new Intent("itrnt_avl");
intent.putExtra("inernet_availability",false);
sendBroadcast(intent);
}
}
catch (NullPointerException e)
{
e.printStackTrace();
Intent intent=new Intent("itrnt_avl");
intent.putExtra("inernet_availability",false);
sendBroadcast(intent);
}
}
bad_dates.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
drawerlayout.closeDrawers();
checkInternetConnection();
if (broadcastReceiver==null)
{
Log.e("Receiver","Not null");
broadcastReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("OnReceive","Called");
hasInternet1=intent.getBooleanExtra("inernet_availability",false);
unregisterReceiver(broadcastReceiver);
broadcastReceiver=null;
if (hasInternet1){
new BackgroundTask1().execute();
}
else {
Log.e("Internet Status","No Internet");
Toast.makeText(getApplicationContext(),"Please check your
InternetConnection and try again later",
Toast.LENGTH_SHORT).show();
}
}
};
registerReceiver(broadcasteceiver,new IntentFilter("itrnt_avl"));
}
});
这里的问题是您首先调用了发布广播的 checkInternetConnection()
,然后进行了注册。也就是说,第一次没有人收到广播。
当您运行第二次checkInternetConnection()
时,您已经注册了第一次接收者,因此接收广播。
因此,您必须先注册广播接收器,然后再调用方法checkInternetConnection()
。
此外,正如您在评论中所问,broadcastReceiver
是注册收到的。方法onReceive()
只有在接收到被拒绝的广播时才会执行。
我正在通过 ping 来检查 Internet 连接 google.If 没有网络或响应不成功 我发送了一个广播,其中包含没有 Internet 的消息。每当我在导航抽屉中单击 Textview 时,它必须检查是否有互联网 connection.Whenever 没有互联网并且我单击未检查的 textview,仅在第二次单击 Textview.The onReceive 方法时检查BroadcastReceiver的不是第一次调用。
代码如下:
public void checkInternetConnection()
{
connectivityManager=(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
networkInfo=connectivityManager.getActiveNetworkInfo();
try {
if (networkInfo!=null)
{
if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE || networkInfo.getType() == ConnectivityManager.TYPE_WIFI)
{
OkHttpClient okHttpClient = new OkHttpClient.Builder().
connectTimeout(30, TimeUnit.SECONDS).
writeTimeout(30, TimeUnit.SECONDS).
readTimeout(30, TimeUnit.SECONDS).build();
Request request = new Request.Builder().url(googleurl).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e("error", "error");
e.printStackTrace();
hasInternet1 = false;
Intent intent=new Intent("itrnt_avl");
intent.putExtra("inernet_availability",false);
sendBroadcast(intent);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.e("Response", response.body().string());
if (response.isSuccessful()) {
hasInternet1 = true;
Intent intent=new Intent("itrnt_avl");
intent.putExtra("inernet_availability",true);
sendBroadcast(intent);
} else {
Log.e("Response", "No response");
hasInternet1 = false;
Intent intent=new Intent("itrnt_avl");
intent.putExtra("inernet_availability",false);
sendBroadcast(intent);
throw new IOException("Unexpected code " + response.body().string());
}
}
});
}
else
{
hasInternet1 = false;
Log.e("Response", "No network type");
Intent intent=new Intent("itrnt_avl");
intent.putExtra("inernet_availability",false);
sendBroadcast(intent);
}
}
else {
hasInternet1=false;
Log.e("Response", "network null");
Intent intent=new Intent("itrnt_avl");
intent.putExtra("inernet_availability",false);
sendBroadcast(intent);
}
}
catch (NullPointerException e)
{
e.printStackTrace();
Intent intent=new Intent("itrnt_avl");
intent.putExtra("inernet_availability",false);
sendBroadcast(intent);
}
}
bad_dates.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
drawerlayout.closeDrawers();
checkInternetConnection();
if (broadcastReceiver==null)
{
Log.e("Receiver","Not null");
broadcastReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("OnReceive","Called");
hasInternet1=intent.getBooleanExtra("inernet_availability",false);
unregisterReceiver(broadcastReceiver);
broadcastReceiver=null;
if (hasInternet1){
new BackgroundTask1().execute();
}
else {
Log.e("Internet Status","No Internet");
Toast.makeText(getApplicationContext(),"Please check your
InternetConnection and try again later",
Toast.LENGTH_SHORT).show();
}
}
};
registerReceiver(broadcasteceiver,new IntentFilter("itrnt_avl"));
}
});
这里的问题是您首先调用了发布广播的 checkInternetConnection()
,然后进行了注册。也就是说,第一次没有人收到广播。
当您运行第二次checkInternetConnection()
时,您已经注册了第一次接收者,因此接收广播。
因此,您必须先注册广播接收器,然后再调用方法checkInternetConnection()
。
此外,正如您在评论中所问,broadcastReceiver
是注册收到的。方法onReceive()
只有在接收到被拒绝的广播时才会执行。