Как показать AlertDialog в AsyncTask без утечки контекста? - PullRequest
0 голосов
/ 25 мая 2019

У меня нижеприведенный код работает нормально, чтобы найти и прочитать запись в базе данных Room через идентификатор.Android Studio требуется добавить блок try / catch, который я включил ниже.

Два вопроса: Могу ли я оставить пустым раздел if {} в onPostExecute (), если нет исключения?

Как мне показать AlertDialog здесь без утечки контекста и без использования хака через WeakReference?

// AsyncTask for reading an existing CardView from the database.
private static class ReadAsyncTask extends AsyncTask<Integer, Void, Quickcard> {

    private QuickcardDao asyncTaskDao;
    Exception e;

    ReadAsyncTask(QuickcardDao dao) {
        asyncTaskDao = dao;
    }

    @Override
    public Quickcard doInBackground(final Integer... params) {

        Quickcard result;
        try {
            result = asyncTaskDao.readCardForUpdate(params[0]);

        } catch (Exception e) {
            this.e = e;
            result = null;
        }
        return result;
    }

    @Override
    protected void onPostExecute(Quickcard quickcard) {

        if (e == null) {
            // *** Okay to leave this blank?  If not, what should go here?
        }
        else {
            // *** How do I show an AlertDialog here with leaking context?
        }
    }
}    

Ответы [ 2 ]

0 голосов
/ 26 мая 2019

Это то, что я сделаю, чтобы предотвратить утечки.

  private static class showDialog extends AsyncTask<String, String, String> {

    private WeakReference<MainActivity> mainActivityWeakReference;

    showDialog(MainActivity mainActivity){
        this.mainActivityWeakReference = new WeakReference<>(mainActivity);

    }
    @Override
    protected String doInBackground(String... params) {
        //do your long long time consuming tasks here.
        return "Done";
    }


    @Override
    protected void onPostExecute(String result) {
        // execution of result of Long time consuming operation
        //Just building an alert dialog to show.
        if (mainActivityWeakReference.get() != null){
            final MainActivity activity = mainActivityWeakReference.get();
            new AlertDialog.Builder(activity).setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    Toast.makeText(activity, "Yes was clicked", Toast.LENGTH_SHORT).show();
                }
            }).show();
        }
    }


    @Override
    protected void onPreExecute() {
    }


    @Override
    protected void onProgressUpdate(String... text) {

    }
}
0 голосов
/ 25 мая 2019

Вы не можете использовать объект представления при использовании потока, который работает в фоновом режиме. U должен реализовать диалог в потоке пользовательского интерфейса.Когда вы реализуете асинхронный класс, в этом методе вы должны показать диалоговое окно с предупреждением.Надеюсь, это поможет ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...