避免用于更新 UI 的静态方法(可能在 Util 类中)的合适方法

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 中更改逻辑而不进行任何修改。始终是一个很好的做法。