DialogFragment 不会在 AsyncTask 中关闭

DialogFragment does not close in AsyncTask

我有办法每 15 秒检查一次 Internet 连接。如果没有互联网连接,该方法将调用 dialogfragment。到目前为止它完美无缺。建立互联网连接后,我无法关闭 dialogFragment。 Logcat不报错。 "dialogfragment dissmis" 不工作,dialogfragment 保留在屏幕上。

首先,我断开与互联网的连接并调用 dialogFragment。后来的互联网连接是 运行 和 "Device is connected to internet." 我看到了文字。但是dialogfragment并没有消失。

CheckInternetAsyncTask.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);
            }
        }

    }
}

EthernetControlFragment

public class EthernetControlFragment extends DialogFragment {

Context context;

public static EthernetControlFragment newInstance(){
    return new EthernetControlFragment();
}



@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NORMAL, R.style.dogum_haritasi_dialog);

}


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.ethernet_controls,container,false);

    return view;
}}

好的,我将在这里详细解释。

15 秒前您使用以下行创建了一个对话框,我们称它为 object1

EthernetControlFragment.newInstance()

然后 15 秒后,您将再次使用上面的行创建一个新对话框 object2,当您关闭它时,您将关闭这个新对话框 object2。不幸的是,您没有保留对旧 Dialog dialog1 的引用,这是真正的问题。

解决方案是只创建一个对象,因此创建 EthernetControlFragment class 的全局引用并仅在它为 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 的最可靠方法。