有没有办法避免在Android中使用instanceOf?

时间:2015-12-17 15:05:00

标签: android instanceof

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

但是让我们考虑一下以下的例子,我们需要调用从片段到其活动的方法:

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

然后我们假设我们在应用中有一个需要调用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的对象,因此我们检查类型。一个改进是添加一个接口,但我们仍然要检查getActvity()返回类型以保护我们的代码。

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

注意:我添加了一个界面来跟随访客模式。请注意,我仍然必须使用instanceOf来确保父活动正在实现它。

谢谢。

Gaspar de Elais

2 个答案:

答案 0 :(得分:6)

你是对的,最好在Fragment中定义一个界面,并要求Activity实现它。然后,在onAttach()中,您将Activity转换为try/catch中的界面,如果它抛出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

答案 1 :(得分:0)

您可以查看访客模式。 Here是一个解释和一些Java代码。