Java DialogFragment在AsyncTask中未关闭
我有办法每15秒检查一次网络连接。如果没有internet连接,该方法将调用dialogfragment。到目前为止,它工作得很好。建立internet连接时,我无法关闭dialogFragment。Logcat没有给出错误。“dialogfragment dissmis”不工作,dialogfragment仍在屏幕上 首先,我断开与internet的连接,并调用dialogFragment。稍后Internet连接正在运行,并且“设备已连接到Internet”。我看到了文本。但对话片段并没有消失 检查InternetAsyncTask.classJava DialogFragment在AsyncTask中未关闭,java,android,fragment,Java,Android,Fragment,我有办法每15秒检查一次网络连接。如果没有internet连接,该方法将调用dialogfragment。到目前为止,它工作得很好。建立internet连接时,我无法关闭dialogFragment。Logcat没有给出错误。“dialogfragment dissmis”不工作,dialogfragment仍在屏幕上 首先,我断开与internet的连接,并调用dialogFragment。稍后Internet连接正在运行,并且“设备已连接到Internet”。我看到了文本。但对话片段并没有消
public class CheckInternetAsyncTask extends AsyncTask<Void, Integer, Boolean> {
Activity activity;
private Context context;
public CheckInternetAsyncTask(Activity activity) {
this.context = activity.getApplicationContext();
this.activity = activity;
}
@Override
protected Boolean doInBackground(Void... params) {
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
assert cm != null;
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnected();
if (isConnected) {
try {
InetAddress ipAddr = InetAddress.getByName("google.com");
//You can replace it with your name
return !ipAddr.equals("");
} catch (Exception e) {
Log.e("TAG", "Error checking internet connection"+ e.getMessage());
return false;
}
} else {
//Log.d("TAG", "No network available!");
return false;
}
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
//Log.d("TAG", "result" + result);
if(result){
// do ur code
Toast.makeText(context,"Device is connected to internet.", Toast.LENGTH_LONG).show();
EthernetControlFragment ethernetControlFragment = EthernetControlFragment.newInstance();
if (ethernetControlFragment != null
&& ethernetControlFragment.getDialog() != null
&& ethernetControlFragment.getDialog().isShowing()
&& !ethernetControlFragment.isRemoving()) {
//dialog is showing so do something
ethernetControlFragment.dismissAllowingStateLoss();
} else {
//dialog is not showing
}
}
else {
Toast.makeText(context,"Device is not connected to internet!",Toast.LENGTH_LONG).show();
EthernetControlFragment ethernetControlFragment = EthernetControlFragment.newInstance();
if (ethernetControlFragment != null
&& ethernetControlFragment.getDialog() != null
&& ethernetControlFragment.getDialog().isShowing()
&& !ethernetControlFragment.isRemoving()) {
//dialog is showing so do something
} else {
//dialog is not showing
ethernetControlFragment.show(((FragmentActivity) activity).getSupportFragmentManager(), "ethernet");
ethernetControlFragment.setCancelable(false);
}
}
}
}
好的,我会在这里详细解释 15秒前,您使用下面的行创建了一个对话框,我们称之为
object1
EthernetControlFragment.newInstance()
15秒后,再次使用上述行创建一个新对话框object2
,当您取消该对话框时,您将取消该新对话框object2
。不幸的是,您没有保留对旧对话框dialog1
的引用,这才是真正的问题所在
解决方案是只创建一个对象,因此创建一个
EthernetControlFragment
类的全局引用,并仅在它为null时初始化它。这样,您将只有一个对话框 我解决了我的问题。像这样调用片段:
Fragment prev = ((FragmentActivity) activity).getSupportFragmentManager().findFragmentByTag("ethernet");
if (prev == null) {
ethernetControlFragment.show(((FragmentActivity) activity).getSupportFragmentManager(), "ethernet");
ethernetControlFragment.setCancelable(false);
}
Fragment prev = ((FragmentActivity) activity).getSupportFragmentManager().findFragmentByTag("ethernet");
if (prev != null) {
EthernetControlFragment df = (EthernetControlFragment) prev;
df.dismiss();
}
就像这样:
Fragment prev = ((FragmentActivity) activity).getSupportFragmentManager().findFragmentByTag("ethernet");
if (prev == null) {
ethernetControlFragment.show(((FragmentActivity) activity).getSupportFragmentManager(), "ethernet");
ethernetControlFragment.setCancelable(false);
}
Fragment prev = ((FragmentActivity) activity).getSupportFragmentManager().findFragmentByTag("ethernet");
if (prev != null) {
EthernetControlFragment df = (EthernetControlFragment) prev;
df.dismiss();
}
我认为这些方法是调用和dissmis fragment最可靠的方法。您是否每15秒调用一次此AsyncTask以显示没有internet对话框internet未连接?是的。正在不断检查。我认为问题是因为您每次都在创建新的对话框对象,所以即使您在连接internet时关闭对话框,它仍然是新对象,而旧的对话框片段仍在显示。不幸的是,它不起作用。我使用if(ethernetControlFragment==null){ethernetControlFragment ethernetControlFragment=ethernetControlFragment.newInstance();}但不起作用:(我建议保留全局引用,假设您在活动中保留了AsyncTask。我的不好,否则我会建议您使用的。无论如何,问题基本上不是保留一个对话对象。我利用您的答案解决了我的问题。谢谢。