gpt4 book ai didi

android - 有什么办法可以避免在 Android 中使用 instanceOf 吗?

转载 作者:太空狗 更新时间:2023-10-29 16:14:19 25 4
gpt4 key购买 nike

我们都同意使用 instanceOf 通常不是最好的解决方案。网上有很多例子。

但是让我们再考虑一下下面的例子,我们需要从一个 fragment 中调用一个方法到它的 Activity 中:

public class BaseActvity extends FragmentActivity implements ISomething {
@Override
public void doSomething();
}

然后假设我们在应用程序中有一个 fragment 需要调用 doSomething() :

public MyFragment extends Fragment() {

public void onCreate() {
public void onResume() {
Activity activity = getActivity();
if (activity != null && activity instanceOf ISomething) {
ISomething something = (ISomething) activity;
something.doSomething();
}
}
}

public interface ISomething {
void doSomething();
}

如您所见,我们不能保证 getActivity() 将返回 ISomething 的对象,因此我们检查类型。一个改进是添加一个接口(interface),但我们仍然会检查 getActvity() 返回类型以保护我们的代码。

由于 Android 框架和 getActivity() 调用的性质,我找不到更好的解决方案。也许有人可以提供一些帮助......

注意:我添加了一个界面来遵循访问者模式。请注意,我仍然必须使用 instanceOf 来确保父 Activity 正在实现它。

谢谢。

加斯帕德埃莱斯

最佳答案

您是对的,最好在您的Fragment 中定义一个接口(interface)并要求Activity 来实现它。然后,在您的 onAttach() 中,您将 Activity 转换为 try/catch 中的接口(interface),如果它抛出 ClassCastException 你可以抛出你自己的异常。

public MyFragment extends Fragment {
private Callback mCallback;

public interface Callback {
void doSomething();
}
...

@Override
public void onAttach(Activity activity) {
try {
mCallback = (Callback)activity;
} catch (ClassCastException e) {
throw new IllegalArgumentException("Activity must implement Callback");
}
}
}

事实上,这就是主要 Android 开发者网站上的 Fragment 页面中推荐/描述的内容:http://developer.android.com/training/basics/fragments/communicating.html

关于android - 有什么办法可以避免在 Android 中使用 instanceOf 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34337768/

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