AsyncTask 完成后更新 Fragment

update Fragment after AsyncTask finishes

我有一个 activity 托管 2 个选项卡片段。我从数据库中获取一些数据,并基于此我想在 AsyncTask 完成后更新我的 2 个选项卡片段中的文本视图。但是,当我尝试更新片段内的视图时,我得到 java.lang.NullPointerException at computing.gmit.ie.scorerapp.Team1Fragment.update(Team1Fragment.java:36) 。这是代码:

public class Tabs extends FragmentActivity implements ActionBar.TabListener {

    private static final String SERVER_ROOT_URI_CYPHER = "xxxxxx";
    private Map<String, List<String>> map = new HashMap<>();
    ActionBar actionBar;
    ActionBar.Tab tab1;
    ActionBar.Tab tab2;
    ViewPager viewPager;
    private List<String> teamList;
    // list of players team 1
    private List<String> team1Players = new ArrayList<>();
    // list of players team 2
    private List<String> team2Players = new ArrayList<>();

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

        viewPager = (ViewPager) findViewById(R.id.pager);
        viewPager.setAdapter(new MyAdapter(getSupportFragmentManager()));
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                getActionBar().setSelectedNavigationItem(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });



        actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        tab1 = actionBar.newTab();
        tab1.setText("Tab 1 ");
        tab1.setTabListener(this);

        tab2 = actionBar.newTab();
        tab2.setText("Tab 2");
        tab2.setTabListener(this);

        actionBar.addTab(tab1);
        actionBar.addTab(tab2);

        //execute async task here
        TeamPlayer teamPlayer = new TeamPlayer();
        teamPlayer.execute();

    }

我的适配器

class MyAdapter extends FragmentPagerAdapter {

        MyAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            Fragment fragement = null;
            if (position == 0) {
                fragement = new Team1Fragment();
            } else {
                fragement = new Team2Fragment();
            }
            return fragement;
        }

        @Override
        public int getCount() {
            return 2;
        }
    }

我的异步任务 -->> null here

private class TeamPlayer extends AsyncTask<Void, Void, Void> {

Team1Fragment frg = new Team1Fragment();

@Override
protected Void doInBackground(Void... params) {
    try {
        getPlayersAndTeams(SERVER_ROOT_URI_CYPHER);
    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;
}

@Override
protected void onPostExecute(Void aVoid) {

    // title of the tabs
    tab1.setText(teamList.get(0));
    tab2.setText(teamList.get(1));

    frg.update();   ------> null 

}
}

我的片段

public class Team1Fragment extends Fragment {

    TextView textView;


    public Team1Fragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_team1, container, false);
        textView = (TextView) view.findViewById(R.id.tvTeam1Fragment);

        return view;
    }

    public void update(){
        textView.setText("HELLOOOO");
    }

}

Team1Fragment frg = new Team1Fragment();

那是你的问题。在将新片段与寻呼机适配器一起使用时,您唯一一次实例化新片段是在 getItem() 方法内,而不是在其他任何地方。请参阅 Android 示例,了解有关带有操作栏的寻呼机内的片段。如果你这样做了,确保你正确地实现了所有的东西,然后你就可以做异步的事情了。

关于您的主要问题:

如果您想从异步任务更新您的片段,请通过引用将您的片段附加到任务,然后更新它,如果它仍然附加到 activity。

关于实施: 如果您的任务驻留在您的 activity 中,您从片段中通知您的 activity(在 onAttach() 或 onViewReady() 中使用 getActivity()),然后 activity 可以启动任务并将片段附加到任务中。

最好用接口抽象整个机制,这样任务并不真正了解片段,而是了解实现接口 TeamDataSubscriber(或类似的东西)并获取数据的订阅者。需要 setSubscribers(TeamDataSubscribers... subs),等等。希望您知道这些东西。