Как сделать тост в классе AsyncTask верхнего уровня - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть класс Fetch верхнего уровня, который расширяет AsyncTask, и у меня есть MainActivity.Я не могу заставить класс Fetch сделать тост из-за отсутствия экземпляра MainActivity или его контекста.Я попытался передать MainActivity классу Fetch, но он потенциально может привести к утечке памяти.Я попытался установить экземпляр WeakReference для контекста, но я не могу сделать тост из этого.

Я читал много других постов по этому поводу, и у большинства, похоже, есть статический внутренний класс, но мой топ-level, и я предпочел бы сохранить его таким образом.

MainActivity создает экземпляр Fetch и затем выполняет его.

public class Fetch extends AsyncTask<Void, Integer, List<List<String>>>
    {
    @Override
    protected void onPreExecute()
        {
        super.onPreExecute();
        }
    @Override
    protected List<List<String>> doInBackground(Context... params)
        {
        // run tasks
        }
    @Override
    protected void onProgressUpdate(Integer... progress)
        {
        }
    @Override
    protected void onPostExecute(List<List<String>> result)
        {
        super.onPostExecute(result);
        }
    }

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Да, не беспокойтесь, вы можете использовать контекст приложения. Можно сделать следующее:

реализовать ваш App.getContext () в вашем приложении.

и используйте его в своем классе "Fetch" и выполните его в MainThread.

0 голосов
/ 16 ноября 2018

В одну сторону, в doInBackground:

runOnUiThread(new Runnable() {
public void run() {
        Toast.makeText(<your class name>.this, "hello", Toast.LENGTH_SHORT).show();
    }
});

Или в onPostExecute (который вызывается в потоке пользовательского интерфейса после завершения фоновых вычислений)

Toast.makeText(<your class name>.this, "hello", Toast.LENGTH_SHORT).show();

Отредактировано: если вы хотите передать контекст AsyncTask ,, вы можете сделать так:

public class MyAsyncTask extends AsyncTask<Void, Integer, List<List<String>>>

    private final Context mContext;

    public MyAsyncTask(final Context context) {
         mContext = context;
    }
}

А в MainActivity :

final MyAsyncTask task = new MyAsyncTask(getApplicationContext());
task.execute();

Повторно отредактировано: Я успешно протестировал WeakReference.

public class ExampleAsyncTask extends AsyncTask {
    private WeakReference<Context> contextRef;

    public ExampleAsyncTask(Context context) {
        contextRef = new WeakReference<>(context);
    }


    @Override
    protected void onPostExecute(Object result) {
        Context context = contextRef.get();
        if (context != null) {
            Toast.makeText(context, "hello", Toast.LENGTH_SHORT).show();
        }
    }
}

В MainActivity:

  new ExampleAsyncTask(MainActivity.this).execute();
...