之前看Glide的源码中有看到过,但是Glide的代码包得严严实实,确实解不开。刚好有个业务场景,可能会导致内存泄漏,我提到这种方法,但是感觉有点复杂,就没做上去,下午花了一点点时间,重新理清了下思路,发现比预料中简单不少。
先说原理吧:
Activity中的Fragemnt的生命周期都会被回调,那么我们放一个空的Fragemnt进去,在Fragemnt的onDestory就可以做我们想做的事情了(eg:回收 and so on)
下面是demo的代码:
45行代码,专门对某个单例做了处理。在pixel、mumu模拟器上测试可用
public class LifeFunction {
private static LifeFunction sInstance = new LifeFunction();
public static LifeFunction getInstance(){
return sInstance;
}
private LifeFunction(){
}
private SimpleCallback mCallback = null;
private String TAG = LifeFunction.class.getSimpleName();
public void register(Context withContext,SimpleCallback callback){
this.mCallback = callback;
if(withContext instanceof Activity){
FragmentManager fm = ((Activity) withContext).getFragmentManager();
RequestManagerFragment current = (RequestManagerFragment) fm.findFragmentByTag(TAG);
if (current == null) {
current = new RequestManagerFragment();
fm.beginTransaction().add(current, TAG).commitAllowingStateLoss();
}
}
}
public void unregister(){
this.mCallback = null;
}
public void call(){
if(this.mCallback != null)this.mCallback.onCall();
}
public interface SimpleCallback{
void onCall();
}
public static class RequestManagerFragment extends Fragment{
@Override
public void onDestroy(){
super.onDestroy();
Log.e("TAG","unregister fragment");
LifeFunction.getInstance().unregister();
}
}
}
简单的测试代码如下
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
findViewById(R.id.test).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LifeFunction.getInstance().call();
}
});
}
}
public class SecondActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LifeFunction.getInstance().register(SecondActivity.this, new LifeFunction.SimpleCallback() {
@Override
public void onCall() {
Log.e("TAG","onCall");
Toast.makeText(SecondActivity.this, "test", Toast.LENGTH_SHORT).show();
}
});
findViewById(R.id.test).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LifeFunction.getInstance().call();
}
});
}
}
PS:如果你在nanny上看到这篇文章,那就是我发的 : )