如何在 Android Studio 中以除 onCreate 之外的其他方法获取应用程序的上下文?

Posted

技术标签:

【中文标题】如何在 Android Studio 中以除 onCreate 之外的其他方法获取应用程序的上下文?【英文标题】:How to get application's context in other method than onCreate in Android Studio? 【发布时间】:2015-08-08 06:50:15 【问题描述】:

我有一个异步任务,它最终会创建参数 email,about。异步任务在 onCreate 方法中,这个 CustomListAdapter 也是。我想将 onPostExecute 中的 asyncTask 中的 onCreate 中的 CustomListAdapter 移动。我的问题是 this 表示应用程序的上下文。当我将它移动到onPostExecute 时,它不再获得该上下文。我试图用 getApplicationContext()activityName.this.getApplicationContext 替换它,但它不起作用,因为它需要应用程序的上下文。我找到了这个Static way to get 'Context' on android?,但由于某种原因我无法在清单中定义名称。我可以在 asyncTask 的 onPostExecute 方法中使用什么其他方法来获取应用程序的上下文?或者我应该只用上下文作为参数来做一个 Asynck 任务?

CustomListAdapter adapter=new CustomListAdapter(this, email,about);
                list=(ListView)findViewById(R.id.list);


 list.setAdapter(adapter);

            list.setOnItemClickListener(new AdapterView.OnItemClickListener() 

                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                                        int position, long id) 
                    // TODO Auto-generated method stub
                    String Slecteditem= email.get(position);
                    Toast.makeText(getApplicationContext(), Slecteditem, Toast.LENGTH_SHORT).show();

                
            );

【问题讨论】:

【参考方案1】:

如果你的活动名称是 MyActivity,你总是可以只使用 MyActivity.this 来获取它的上下文

【讨论】:

解决了。我只试过MyActivity.this.getApplicationContext。似乎只有 MyActivity.this 获得了上下文。谢谢。【参考方案2】:

您可以在CustomAysncTask 的构造函数中传递Activity 组件的上下文,如下面的代码sn-p 并使用它。但始终正确检查null

MyActivity activity
public CustomAsycTask(MyActivity activity) 
   this.activity=activity;

更新:正如Tomer Shemesh 指出的那样

private WeakReference<MyActivity> activity = null;

public CustomAsycTask(MyActivity activity) 
    activity= new WeakReference<MyActivity>(activity);

以及访问它:

final MyActivity iActivity = activity.get();

【讨论】:

将活动的引用传递给异步任务是非常糟糕的做法,因为如果您的任务在活动完成后运行,您将崩溃或出现内存泄漏。 MainActivity.this 里面的AsyncTask 不会? 它不会造成内存泄漏,只要你做一个空检查就可以了 我猜两者都会造成内存问题,正如我所说的那样,空检查将在那里 嗯。我的印象是调用 Activity.this 不会导致内存问题,因为它不会阻止 Activity 被销毁,但保持对 Activity 的活动引用将停止对 Activity 进行垃圾收集。

以上是关于如何在 Android Studio 中以除 onCreate 之外的其他方法获取应用程序的上下文?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android Studio 中以编程方式上传和下载 Google Drive 上的任何文件

在 Android Studio 中以编程方式从应用程序触发系统的暗模式

从 Android Studio 中的 SQLite 数据库中以字符串形式检索数据

如何在 SQL Server Management Studio 中以“真实”CSV 格式获取导出输出?

打开Android Studio时报Unable to access Android SDK add-on list

Android Studio启动时出现unable to access android sdk add-on list