Hie*_*yen 5 android static-methods design-patterns
我是 Android 的初学者,我阅读并查看使用 Util 类中的静态方法来更新 UI 是否不适用于单元测试。我如何以合适的方式避免它来维护代码和单元测试?
例子:
class ActivityA {
private View view;
private MyListener myListener;
public void methodB() {
Util.callLogicB(this, view, myListener);
}
}
class ActivityB {
private View view;
private MyListener myListener;
public void methodC() {
Util.callLogicB(this, view, myListener);
}
}
class Util {
public static void callLogicB(Context context, View view, MyListener listener) {
// do something with view
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
我认为实现这一点的最佳方法是将您的视图(您的活动)与逻辑类完全断开。这可以使用接口来完成。
查看下面的代码以了解接口的工作原理。我创建了一个 mainActivity,并使用 textView 作为布局。我创建的 LogicWithTextUpdate 类能够更新 mainActivity 中的 textView,而无需直接引用它。
public class MainActivity extends Activity implements MyViewListener {
//Your logic class, that is capable of updating a textview
LogicWithTextUpdate logicWithTextUpdate;
@Override
protected void onCreate(Bundle savedInstanceState) {
//This is just to create a layout (with a textview inside)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//This creates the class using constructor (and set listener)
logicWithTextUpdate = new LogicWithTextUpdate(this);
//Update or execute your logic. This will update textview using interface MyViewListener (onUpdateTextListener)
//This can be executed using a button (Onclick...)
logicWithTextUpdate.doSomeLogic(2);
}
@Override
public void onUpdateTextListener(String text) {
//Only here code runs inside your activity class
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(text);
}
}
Run Code Online (Sandbox Code Playgroud)
如你看到的。MainActivity 将使用“监听器”onUpdateTextListener 更新文本视图。这是在接口类中描述的:
public interface MyViewListener {
//to be implemented inside your mainActivity
public void onUpdateTextListener(String text);
}
Run Code Online (Sandbox Code Playgroud)
现在我可以实现一个可以执行一些逻辑并触发侦听器的类:
public class LogicWithTextUpdate {
MyViewListener myViewListener;
//Constructor here is used to set myViewListener (but you can use a setter like setMyViewListener)
public LogicWithTextUpdate(MyViewListener myViewListener) {
this.myViewListener = myViewListener;
}
public void doSomeLogic(int a) {
//Some logic
a = a * 2;
a = a + 1;
//Update text using listener. This will update mainActivity, because it is implementing MyViewListener
myViewListener.onUpdateTextListener(String.valueOf(a));
}
}
Run Code Online (Sandbox Code Playgroud)
doSomeLogic 方法是从您的活动中执行的,但逻辑位于类内部。执行逻辑后,它会触发 myViewListener.onUpdateTextListener,该监听器会在您的 Activity 内执行 onUpdateTextListener 。
一切都断开了。您可以在 LogicWithTextUpdate 中更改视图而不进行任何修改,或者在 Actitivy 中更改逻辑而不进行任何修改。始终是一个很好的做法。