Open phenomLi opened 6 years ago
有时候我们想要在一个ActivityA中,去调用另一个ActivityB的方法,那么我们可以在ActivityB中,将这个方法设置为静态方法: ActivityB:
ActivityA
ActivityB
//ActivityB public class ActivityB { public static void method() { Log.i("", "我是ActivityB的方法。"); } }
在ActivityA中调用:
//ActivityA ActivityB.method();
但是,假如ActivityB中的method方法不是一个静态方法,那么ActivityA想要调用它,又该怎么办呢? 有人也许会说,把method声明为static或者把方法抽象成公共类不就行了吗?说是这样说,但是有些条件下,并不允许这样做:
method
static
受限于业务,一个方法里面的逻辑可能会非常复杂,引用了许多的临时变量或者非静态变量,为了这样一个要求而把里面的所有变量都设置为静态变量,这显然是一种得不偿失的做法,首先注册为静态变量,意味着不能被GC(Garbage Clean)。第二,可能不止这一个方法引用了这些变量,一个变量改了,可能其他方法也要改,会造成牵一发而动全身的情况。
有时候方法里面的变量不是临时变量,而是该Activity类的属性(或者依赖于该Activity类),那么这个方法就无法被抽象成公共类。
Activity
道理我都懂,那么究竟该怎么做呢?
既然我们无法直接从类上访问这个方法,那么我们可以使用一个中介,这个中介是这个类的实例,通过这个中介来访问该方法,而为了使这个中介可以被访问,我们要使用一个静态变量来保存这个中介。 步骤如下:
1.首先,在ActivityB中声明一个静态(中介)变量context,这个变量是保存ActivityB的实例的。
context
public class ActivityB extends AppCompatActivity { //中介变量context private static ActivityB context = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } //非静态的公共方法 public void method() { Log.i("", "我是ActivityB的方法。"); } }
2.之后,在onCreate中,将ActivityB的实例指向context。
onCreate
public class ActivityB extends AppCompatActivity { //中介变量context private static ActivityB context = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //初始化context context = this; } //非静态的公共方法 public void method() { Log.i("", "我是ActivityB的方法。"); } }
3.最后,我们增加一个getActivity的公共静态方法,用作将context暴露出去。
getActivity
public class ActivityB extends AppCompatActivity { //中介变量context private static ActivityB context = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //初始化context context = this; } //非静态的公共方法 public void method() { Log.i("", "我是ActivityB的方法。"); } //使用这个方法,使得其他类可以访问context public static Activity getActivity() { return context; } }
之后,我们在ActivityA中就可以愉快地通过getActivity中访问ActivityB中的非静态方法method了:
ActivityB.getActivity().method();
哈哈。 最后还是要说一句,其实在日常开发中,最好少使用这些hack的方法,一来容易造成内存泄漏,二来,当你发现你要调用另一个Activity中的方法而这个方法又很难抽象成公共类的时候,说明你的代码耦合度已经比较高了,也就是说架构出现问题了(没错我就是这么菜)。这时候与其用这些hack的办法打补丁倒不如认认真真去把代码重构一下。
有时候我们想要在一个
ActivityA
中,去调用另一个ActivityB
的方法,那么我们可以在ActivityB
中,将这个方法设置为静态方法:ActivityB:
在ActivityA中调用:
但是,假如
ActivityB
中的method
方法不是一个静态方法,那么ActivityA
想要调用它,又该怎么办呢?有人也许会说,把
method
声明为static
或者把方法抽象成公共类不就行了吗?说是这样说,但是有些条件下,并不允许这样做:受限于业务,一个方法里面的逻辑可能会非常复杂,引用了许多的临时变量或者非静态变量,为了这样一个要求而把里面的所有变量都设置为静态变量,这显然是一种得不偿失的做法,首先注册为静态变量,意味着不能被GC(Garbage Clean)。第二,可能不止这一个方法引用了这些变量,一个变量改了,可能其他方法也要改,会造成牵一发而动全身的情况。
有时候方法里面的变量不是临时变量,而是该
Activity
类的属性(或者依赖于该Activity
类),那么这个方法就无法被抽象成公共类。道理我都懂,那么究竟该怎么做呢?
既然我们无法直接从类上访问这个方法,那么我们可以使用一个中介,这个中介是这个类的实例,通过这个中介来访问该方法,而为了使这个中介可以被访问,我们要使用一个静态变量来保存这个中介。
步骤如下:
1.首先,在
ActivityB
中声明一个静态(中介)变量context
,这个变量是保存ActivityB
的实例的。2.之后,在
onCreate
中,将ActivityB
的实例指向context
。3.最后,我们增加一个
getActivity
的公共静态方法,用作将context
暴露出去。之后,我们在
ActivityA
中就可以愉快地通过getActivity
中访问ActivityB
中的非静态方法method
了:哈哈。
最后还是要说一句,其实在日常开发中,最好少使用这些hack的方法,一来容易造成内存泄漏,二来,当你发现你要调用另一个
Activity
中的方法而这个方法又很难抽象成公共类的时候,说明你的代码耦合度已经比较高了,也就是说架构出现问题了(没错我就是这么菜)。这时候与其用这些hack的办法打补丁倒不如认认真真去把代码重构一下。