如何从静态ASyncTask获取当前显示的活动?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从静态ASyncTask获取当前显示的活动?相关的知识,希望对你有一定的参考价值。

我目前正在通过一个快速的ASyncTask通过快餐栏消息报告其结果。

这是ASynctask的顶部:

private static class PushSettingsToDevice extends AsyncTask<URL, Void, Boolean> {
    private View rootView;
    private PushSettingsToDevice(View rootView){this.rootView = rootView;}

这是结束:

@Override
    protected void onPostExecute(Boolean result) {
        try{
            Log.d(TAG, "pushSettings Finished.");
            Snackbar.make(rootView, MyApplication.getContext().getResources().getString(R.string.app_schedule_menu_settings_applied), Snackbar.LENGTH_LONG).show();
        } catch(Exception e){
            e.printStackTrace();
        }

要显示snackBar,我需要一个View(我的例子中的rootView)的引用,但是通过这样做,我从静态类引用一个视图,并创建一个内存泄漏。

如何在用户当前看到的任何视图上显示snackBar?换句话说,如何从我的静态ASyncTask中检索当前显示给用户的Activity,然后在此Activity中查看一个视图?

答案

解决方案由jackz314提供

这是新代码:

private static class PushSettingsToDevice extends AsyncTask<URL, Void, Boolean> {
    private WeakReference<View> rootView;

    private PushSettingsToDevice(View rootView, boolean debug_mode){this.rootView = new WeakReference<>(rootView);}

最后:

@Override
    protected void onPostExecute(Boolean result) {
        try{
            Log.d(TAG, "pushSettings Finished.");
            if(rootView != null){
                Snackbar.make(rootView.get(), MyApplication.getContext().getResources().getString(R.string.app_schedule_menu_settings_applied), Snackbar.LENGTH_LONG).show();
            }
        } catch(Exception e){
            e.printStackTrace();
        }

以上是关于如何从静态ASyncTask获取当前显示的活动?的主要内容,如果未能解决你的问题,请参考以下文章

由于 AsyncTask 是一个单独的类,如何将 OnPostExecute() 的结果获取到主要活动?

JSONArray 到 ListView - AsyncTask

如何从 Android AsyncTask 更改活动 UI?

重新创建活动时如何从 AsyncTask 更新 TextView

Android -- 关闭AsyncTask(异步任务)

使用 AsyncTask 根据值定义文本颜色