Java DialogFragment在AsyncTask中未关闭

Java DialogFragment在AsyncTask中未关闭,java,android,fragment,Java,Android,Fragment,我有办法每15秒检查一次网络连接。如果没有internet连接,该方法将调用dialogfragment。到目前为止,它工作得很好。建立internet连接时,我无法关闭dialogFragment。Logcat没有给出错误。“dialogfragment dissmis”不工作,dialogfragment仍在屏幕上 首先,我断开与internet的连接,并调用dialogFragment。稍后Internet连接正在运行,并且“设备已连接到Internet”。我看到了文本。但对话片段并没有消

我有办法每15秒检查一次网络连接。如果没有internet连接,该方法将调用dialogfragment。到目前为止,它工作得很好。建立internet连接时,我无法关闭dialogFragment。Logcat没有给出错误。“dialogfragment dissmis”不工作,dialogfragment仍在屏幕上

首先,我断开与internet的连接,并调用dialogFragment。稍后Internet连接正在运行,并且“设备已连接到Internet”。我看到了文本。但对话片段并没有消失

检查InternetAsyncTask.class

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。我的不好,否则我会建议您使用的。无论如何,问题基本上不是保留一个对话对象。我利用您的答案解决了我的问题。谢谢。