Android 能否从WeakReference';返回强引用;s get方法是否导致AsyncTask onProgressUpdate中内存泄漏?

Android 能否从WeakReference';返回强引用;s get方法是否导致AsyncTask onProgressUpdate中内存泄漏?,android,android-asynctask,weak-references,Android,Android Asynctask,Weak References,我想使用WeakReference来避免AsyncTask中的内存泄漏。我在网上找到的示例仅使用onPostExecute中的get()方法,但我还想使用它来更新进度。现在我想知道,频繁调用get方法本身是否会导致内存泄漏 private static class ExampleAsyncTask extends AsyncTask<Integer, Integer, String> { private WeakReference<MainActivity> ac

我想使用
WeakReference
来避免
AsyncTask
中的内存泄漏。我在网上找到的示例仅使用
onPostExecute
中的
get()
方法,但我还想使用它来更新进度。现在我想知道,频繁调用
get
方法本身是否会导致内存泄漏

private static class ExampleAsyncTask extends AsyncTask<Integer, Integer, String> {
    private WeakReference<MainActivity> activityReference;

    ExampleAsyncTask(MainActivity context) {
        activityReference = new WeakReference<>(context);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        MainActivity activity = activityReference.get();
        if (activityReference.get() == null) {
            return;
        }

        activity.progressBar.setVisibility(View.VISIBLE);
    }

    @Override
    protected String doInBackground(Integer... integers) {
        Log.i("TAG", "doInBackground started");
        for (int i = 1; i < integers[0]; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            publishProgress((i * 100) / integers[0]);
        }

        return "Finished";
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);

        MainActivity activity = activityReference.get();
        if (activity == null || activity.isFinishing()) {
            return;
        }

        activity.progressBar.setProgress(values[0]);
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);

        MainActivity activity = activityReference.get();
        if (activity == null || activity.isFinishing()) {
            return;
        }

        activity.progressBar.setProgress(0);
        activity.progressBar.setVisibility(View.INVISIBLE);
        Toast.makeText(activity, s, Toast.LENGTH_SHORT).show();
    }
}
私有静态类示例AsyncTask扩展了AsyncTask{
私人财富参考活动参考;
示例AsyncTask(MainActivity上下文){
activityReference=新的WeakReference(上下文);
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
MainActivity=activityReference.get();
if(activityReference.get()==null){
返回;
}
activity.progressBar.setVisibility(View.VISIBLE);
}
@凌驾
受保护的字符串doInBackground(整数…整数){
Log.i(“TAG”,“doInBackground启动”);
对于(int i=1;i<整数[0];i++){
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
出版进度((i*100)/整数[0]);
}
返回“完成”;
}
@凌驾
受保护的void onProgressUpdate(整型…值){
super.onProgressUpdate(值);
MainActivity=activityReference.get();
if(activity==null | | activity.isFinishing()){
返回;
}
activity.progressBar.setProgress(值[0]);
}
@凌驾
受保护的void onPostExecute(字符串s){
super.onPostExecute(s);
MainActivity=activityReference.get();
if(activity==null | | activity.isFinishing()){
返回;
}
activity.progressBar.setProgress(0);
activity.progressBar.setVisibility(View.INVISIBLE);
Toast.makeText(活动,s,Toast.LENGTH_SHORT).show();
}
}

get
onProgressUpdate
而言,您的代码几乎没有强引用,因为您使用的局部变量将超出范围,
onProgressUpdate
完成时


因此,基本上每次代码访问引用时,都是从
get()
方法检索的,因此它是安全的。虽然这会是一个问题,但如果您在
onProgressUpdate
method

之外声明了一个引用,谢谢您,这正是我想知道的:)我很高兴我能提供帮助,happy Coding不知何故在方法的范围内
get
,在离开后退按钮后仍然返回主活动。我在logcat中检查了它。请尝试在logcat中应用null check
activityReference.get()==null
activity==null
,因为类型不会更改,只有null引用是concernedIt仍然返回活动。我不明白