Android应用程序中的无法恢复活动错误

3

我有一个FragmentActivity,它目前运行得非常完美。

public class ChallongeEvent extends FragmentActivity {
    private TextView tab_text;
    private String EVENT_ID, URL;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.challonge_act_event);
        init();
    }

    private void init() {
        tab_text = (TextView) findViewById(R.id.tab_text);

        Intent intent = getIntent();
        EVENT_ID = intent.getStringExtra("event_id");
        URL = "https://api.challonge.com/v1/tournaments/" + EVENT_ID + ".json";

        String titles[] = new String[] { getString(R.string.details), getString(R.string.players) };
        int numTabs = titles.length;

        EventAdapter adapter = new EventAdapter(getSupportFragmentManager(), titles, numTabs);
        ViewPager pager = (ViewPager) findViewById(R.id.pager);
        pager.setAdapter(adapter);
        pager.setCurrentItem(numTabs - 1);

        SlidingTabLayout sliding_tabs = (SlidingTabLayout) findViewById(R.id.sliding_tabs);
        sliding_tabs.setDistributeEvenly(true);
        sliding_tabs.setViewPager(pager);
    }

    @Override
    public void onResume() {
        super.onResume();
        populate();
    }

    private void populate() {
        AsyncGet fetch = new AsyncGet(new AsyncResponse() {
            @Override
            public void processFinish(String output) {
                for (Fragment fragment : getSupportFragmentManager().getFragments())
                {
                    if (fragment instanceof ChallongePlayers) {
                        ((ChallongePlayers) fragment).parsePlayers(output);
                    } else if (fragment instanceof ChallongeMatches) {
                        ((ChallongeMatches) fragment).parseMatches(output);
                    }
                }
            }
        });

        HttpUrl.Builder urlBuilder = HttpUrl.parse(URL).newBuilder();
        urlBuilder.addQueryParameter("api_key", Challonge.API_KEY);
        urlBuilder.addQueryParameter("include_participants", "1");
        urlBuilder.addQueryParameter("include_matches", "1");
        fetch.execute(urlBuilder.build().toString());
    }
}

当FragmentActivity启动时,它从API获取JSON数据,然后将此API的数据发送到页卡中的几个Fragment。 它使用以下代码执行此操作:

        AsyncGet fetch = new AsyncGet(new AsyncResponse() {
            @Override
            public void processFinish(String output) {
                for (Fragment fragment : getSupportFragmentManager().getFragments())
                {
                    if (fragment instanceof ChallongePlayers) {
                        ((ChallongePlayers) fragment).parsePlayers(output);
                    } else if (fragment instanceof ChallongeMatches) {
                        ((ChallongeMatches) fragment).parseMatches(output);
                    }
                }
            }
        });

        HttpUrl.Builder urlBuilder = HttpUrl.parse(URL).newBuilder();
        urlBuilder.addQueryParameter("api_key", Challonge.API_KEY);
        urlBuilder.addQueryParameter("include_participants", "1");
        urlBuilder.addQueryParameter("include_matches", "1");
        fetch.execute(urlBuilder.build().toString());

然而,这些片段中每个都有一个 SwipeRefreshLayout,我希望在执行 AsyncTask 请求之前激活它的 .setRefreshing(true)。因此,我将这些片段中的 SwipeRefreshLayout 设置为公共,并尝试在 AsyncGet fetch = ... 代码行上方添加以下内容:
        for (Fragment fragment : getSupportFragmentManager().getFragments())
        {
            if (fragment instanceof ChallongePlayers) {
                ((ChallongePlayers) fragment).swipe_container.setRefreshing(true);
            } else if (fragment instanceof ChallongeMatches) {
                ((ChallongeMatches) fragment).swipe_container.setRefreshing(true);
            }
        }

很遗憾,此代码的第一行会产生一个错误:

java.lang.NullPointerException: 尝试在空对象引用上调用接口方法'java.util.Iterator java.util.List.iterator()'

为什么会出现这个问题呢?


当调用 getSupportFragmentManager().getFragments() 时,你是否有可能还未添加任何 Fragment 呢? - George Mulligan
片段被添加在 init() 中,该方法会在 onCreate 中执行。populate 的第一次运行可以在 onResume 中进行,该方法会在 onCreate 之后执行。 - Jason Axelrod
1个回答

1
< p > getFragments() 调用返回的集合尚未初始化,为 null。

您可以添加一个 if 检查以确保在迭代之前 getFragments() 不会返回 null 集合:

if(getSupportFragmentManager().getFragments() != null) {
    for (Fragment fragment : getSupportFragmentManager().getFragments())
    {
        if (fragment instanceof ChallongePlayers) {
            ((ChallongePlayers) fragment).swipe_container.setRefreshing(true);
        } else if (fragment instanceof ChallongeMatches) {
            ((ChallongeMatches) fragment).swipe_container.setRefreshing(true);
        }
    }
}

getSupportFragmentManager().executePendingTransactions(); 没有改变任何东西... 但检查是否为空已经是足够好的解决方案了。 - Jason Axelrod
那么最好从答案中将其删除。我猜FragmentPagerAdapter在处理片段时可能有一些不同的操作。 - George Mulligan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接