ProgressDialog.show () - активность просочилась в окно - PullRequest
1 голос
/ 01 марта 2020

Я создал класс AsyncTask для всех моих фоновых процессов, которым требуется ProgressDialogs, и поместил его в мой класс Utils java, но когда я пытаюсь вызвать его, он вызывает описанную ошибку в методе show() ProgressDialog.

Вот класс AsyncTask в классе Utils:

public static class BackgroundTask extends AsyncTask<Void, Void, Void> {
    private WeakReference<Context> context;
    private ProgressDialog progressDialog;
    private String message;

    private Runnable doInBackground;

    public BackgroundTask(Context context, String message, Runnable doInBackground) {
        this.context = new WeakReference<>(context);
        this.message = message;
        this.doInBackground = doInBackground;

    }

    @Override
    protected void onPreExecute() {
        if (context == null)
            return;
        progressDialog = new ProgressDialog(context.get(), R.style.dialogStyle);
        progressDialog.setMessage(message);
        progressDialog.setCancelable(false);
        progressDialog.setCanceledOnTouchOutside(false);
        progressDialog.setIndeterminate(false);
        progressDialog.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
        doInBackground.run();
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        if(progressDialog != null)
            progressDialog.dismiss();
        progressDialog = null;
    }
}

А вот как я называю его на MainActivity:

new Utils.BackgroundTask(this, "Loading...",() -> {
    // Something heavy to do
}).execute();

В чем проблема и как можно я чиню это. Заранее спасибо.

Редактировать

Возможно, есть проблема с загрузкой фрагмента в активности? Это то, что я точно называю в моем MainActivity:

new Utils.BackgroundTask(this, "Loading...",() -> {
    String codeResponse = NetworkConnection.get(this, NetworkConnection.BaseUrl + "sms/code.php?mobile=0" + phoneNumber);
    if(codeResponse != null){
        this.code = new Gson().fromJson(codeResponse, CheckCodeModel.class).getCode();
        Toast.makeText(this, "Code is :" + code + ":", Toast.LENGTH_SHORT).show();

        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.fl_login_fragmentHolder,new LoginCheckCodeFragment(),"CheckCode");
        transaction.addToBackStack("CheckCode");
        transaction.commit();
    }
}).execute();

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Для правильного использования WeakReferences вам необходимо проверить, является ли базовое значение нулевым, а не вашим слабым ссылочным объектом.

, т. Е. Не:

if (context == null)  // this is always `false` as you instantiate in your constructor

, но:

if (context.get() == null)

Возможно, вы заметили его с более ясным именем переменной, возможно, используя weakRefToContext вместо context.

0 голосов
/ 01 марта 2020

Исправлено путем помещения части моего кода в метод runOnUiThread():

new Utils.BackgroundTask(LoginActivity.this, "Loading...",() -> {
    String codeResponse = NetworkConnection.get(this, NetworkConnection.BaseUrl + "sms/code.php?mobile=0" + phoneNumber);
    if(codeResponse != null){
        runOnUiThread(() -> {
            this.code = new Gson().fromJson(codeResponse, CheckCodeModel.class).getCode();
            Toast.makeText(this, "Code is :" + code + ":", Toast.LENGTH_SHORT).show();

            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.fl_login_fragmentHolder,new LoginCheckCodeFragment(),"CheckCode");
            transaction.addToBackStack("CheckCode");
            transaction.commit();
        });
    }
}).execute();

Спасибо @Aman B. и @ Blundell.

...