使用集合调用构造函数类并从 asyncTask 获取 sharedpreferences(无法传递上下文)

Posted

技术标签:

【中文标题】使用集合调用构造函数类并从 asyncTask 获取 sharedpreferences(无法传递上下文)【英文标题】:Calling constructor class with sets and gets sharedpreferences from an asyncTask (can't pass context) 【发布时间】:2020-10-06 22:40:59 【问题描述】:

我在构造函数类中获取和设置 sharedPreferences

private Context context;
public NewBusiness (Context c) 
    this.context = c;
    pref = android.preference.PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    pref = context.getSharedPreferences("MyPref", 0);
    editor = pref.edit();

public String getLogo() 
    return pref.getString("logo", logo);


public void setLogo(String logo) 
    editor.putString("logo", logo);
    editor.commit();

但是我是从异步任务(它使用 Wea​​kReference 上下文,以防止内存泄漏)调用它

private WeakReference<Context> contextRef;
public UploadBusiness(Context context) 
    contextRef = new WeakReference<>(context);

@Override
protected String doInBackground(Void... params) 

    newBusiness = new NewBusiness(contextRef); //Can´t use WeakReference<Context>
    return "Upload successful";

问题是弱引用上下文不能作为上下文传递

如何在不导致内存泄漏的情况下使用上下文调用构造函数类?

【问题讨论】:

【参考方案1】:

您需要在弱引用实例上使用 get() 方法来获取实际对象。像这样的:

private WeakReference<Context> contextRef;
public UploadBusiness(Context context) 
    contextRef = new WeakReference<>(context);

@Override
protected String doInBackground(Void... params) 

    if(contextRef.get()!=null)
        newBusiness = new NewBusiness(contextRef.get());
     
    return "Upload successful";

【讨论】:

很高兴它有帮助...在使用 get 方法时最好进行空检查,以确保您的上下文尚未被破坏。用空检查更新答案

以上是关于使用集合调用构造函数类并从 asyncTask 获取 sharedpreferences(无法传递上下文)的主要内容,如果未能解决你的问题,请参考以下文章

Android O:AsyncTask分析

Android O:AsyncTask分析

Java集合:未获支持的操作及UnsupportedOperationException

C++ 静态工厂构造函数

从 IntentService 调用 AsyncTask 的问题

匿名 AsyncTask 中的构造函数,例如“new AsyncTask<Exercise,Void,Void>()”?