gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:29 26 4
gpt4 key购买 nike

我是 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
}
}

最佳答案

我认为实现这一点的最佳方法是将您的 View (您的 Activity )与您的逻辑类完全分离。这可以使用界面来完成。

查看下面的代码以了解接口(interface)的工作原理。我创建了一个带有 textView 作为布局的 mainActivity。我创建的类 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);
}
}

如您所见。 MainActivity 将使用 onUpdateTextListener 的“监听器”更新 textview。这是在接口(interface)类中描述的:

public interface MyViewListener {
//to be implemented inside your mainActivity
public void onUpdateTextListener(String text);
}

现在我可以实现一个可以执行某些逻辑并触发监听器的类:

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));
}
}

方法 doSomeLogic 是从您的 Activity 中执行的,但逻辑在类内部。逻辑执行后,它会触发 myViewListener.onUpdateTextListener,在您的 Activity 中执行 onUpdateTextListener

一切都断开连接。您可以在不修改 LogicWithTextUpdate 的情况下更改您的 View ,或者在不修改 Activy 的情况下更改逻辑。永远是一个好习惯。

关于android - 避免用于更新 UI 的静态方法(可能在 Util 类中)的合适方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44557583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com