由分析OSC Android 端App引发的关于弱引用的思考

最近在分析OSC的Android端代码,发现里面使用了弱引用(mContext):

private class CacheTask extends AsyncTask<String, Void, ListEntity<T>> {
    private final WeakReference<Context> mContext;

    private CacheTask(Context context) {
        mContext = new WeakReference<Context>(context);
    }

    @Override
    protected ListEntity<T> doInBackground(String... params) {
        Serializable seri = CacheManager.readObject(mContext.get(), params[0]);
        if (seri == null) {
            return null;
        } else {
            return readList(seri);
        }
    }

    @Override
    protected void onPostExecute(ListEntity<T> list) {
        super.onPostExecute(list);
        if (list != null) {
            executeOnLoadDataSuccess(list.getList());
        } else {
            executeOnLoadDataError(null);
        }
        executeOnLoadFinish();
    }
}

从以上代码中并未看到对弱引用的校验,万一弱引用失效且不是会导致空指针异常,于是研究CacheManager.readObject()方法:

public static Serializable readObject(Context context, String file) {
    if (!isExistDataCache(context, file))
        return null;
    FileInputStream fis = null;
    ObjectInputStream ois = null;
    try {
        fis = context.openFileInput(file);
        ois = new ObjectInputStream(fis);
        return (Serializable) ois.readObject();
    } catch (FileNotFoundException e) {
    } catch (Exception e) {
        e.printStackTrace();
        // 反序列化失败 - 删除缓存文件
        if (e instanceof InvalidClassException) {
            File data = context.getFileStreamPath(file);
            data.delete();
        }
    } finally {
        try {
            ois.close();
        } catch (Exception e) {
        }
        try {
            fis.close();
        } catch (Exception e) {
        }
    }
    return null;
}

可惜这里也没显示的进行验证,那么在深入查看isExistDataCache(context, file)方法是否校验:

public static boolean isExistDataCache(Context context, String cachefile) {
    if (context == null)//在此处进行判断弱引用是否还有效
        return false;
    boolean exist = false;
    File data = context.getFileStreamPath(cachefile);
    if (data.exists())
        exist = true;
    return exist;
}

总算找到了,其实在操作弱引用的时候,我们首要的任务是检查弱引用是否还有效,如果有效则继续下一步动作,如果无效,那么就退出操作,如果有效,则继续操作。

还有一点就是,如果是保存键值对,那么弱引用不能作为key,只能作为value来保存,否则如果弱引用失效,key变为null,那么调用必然失败。

你可能感兴趣的:(由分析OSC Android 端App引发的关于弱引用的思考)