Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将任务异步到ViewPager的onPageSelected中的片段?_Java_Android_Android Fragments_Android Asynctask_Android Viewpager - Fatal编程技术网

Java 如何将任务异步到ViewPager的onPageSelected中的片段?

Java 如何将任务异步到ViewPager的onPageSelected中的片段?,java,android,android-fragments,android-asynctask,android-viewpager,Java,Android,Android Fragments,Android Asynctask,Android Viewpager,我是Android编程新手。 我在谷歌上搜索并阅读了android文档,但没有任何帮助,或者可能我理解得不好。 我正试图通过从ViewPager中选择的onPageSelected将任务UI异步化为片段。 与AndroMoney app ViewPager类似(在onPageSelected之前,它显示“加载…”,而在onPageSelected之后,它会异步任务并加载。): 但我的代码是:它在切换时执行异步任务,有时会在两个片段之间停止,如下所示: 与AndroMoney应用程序不同,

我是Android编程新手。
我在谷歌上搜索并阅读了android文档,但没有任何帮助,或者可能我理解得不好。

我正试图通过从ViewPager中选择的onPageSelected将任务UI异步化为片段。

与AndroMoney app ViewPager类似(在onPageSelected之前,它显示“加载…”,而在onPageSelected之后,它会异步任务并加载。):


但我的代码是:它在切换时执行异步任务,有时会在两个片段之间停止,如下所示:


与AndroMoney应用程序不同,我的代码没有在页面上选择asynctask。

下面是MyFragment.java:

public class MyFragment extends Fragment {
    public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE";
    final StringBuilder buffer=new StringBuilder();
    View v;
    public static final MyFragment newInstance(int message) {
        MyFragment f = new MyFragment();
        Bundle bdl = new Bundle(1);
        bdl.putInt(EXTRA_MESSAGE, message);
        f.setArguments(bdl);
        return f;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        v = inflater.inflate(R.layout.myfragment_layout, container, false);
        new AsyncDatabase().execute();
        return v;
    }

    public class AsyncDatabase extends AsyncTask<Void,Void,Void>{
        @Override
        protected Void doInBackground(Void... params){
            int message = getArguments().getInt(EXTRA_MESSAGE);
            BibleService bService=new BibleServiceImpl(getActivity().getApplication());
            List<Bible> bible=bService.getBibleByChapterNumber("Salm", message);
            for(Bible b: bible){
                for(int i=0;i<10;i++){
                    buffer.append(b);
                }
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void result){
            TextView txt1=(TextView)v.findViewById(R.id.textView1);
            TextView txt2=(TextView)v.findViewById(R.id.textView2);
            txt1.setText("Done");
            txt2.setText(buffer.toString());
        }
        @Override
        protected void onPreExecute(){
            TextView txt1=(TextView)v.findViewById(R.id.textView1);
            txt1.setText("Loading...");
        }
        @Override
        protected void onProgressUpdate(Void... values){

        }
    }


}
public class PageViewActivity extends FragmentActivity{
    MyPageAdapter pageAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_page_view);

        List<Fragment> fragments = getFragments();

        pageAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments);

        ViewPager pager = (ViewPager) findViewById(R.id.viewpager);
        pager.setOffscreenPageLimit(1);
        pager.setAdapter(pageAdapter);
        pager.setCurrentItem(11);

        pager.setOnPageChangeListener(new OnPageChangeListener() {
            public void onPageScrollStateChanged(int state) {

            }

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

            public void onPageSelected(int position) {

            }
        });

    }

    private List<Fragment> getFragments() {
        List<Fragment> fList = new ArrayList<Fragment>();

        for (int j = 2; j < 150; j++) {
            fList.add(MyFragment.newInstance(j));
        }

        return fList;
    }

    private class MyPageAdapter extends FragmentStatePagerAdapter {
        private List<Fragment> fragments;

        public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) {
            super(fm);
            this.fragments = fragments;
        }

        @Override
        public Fragment getItem(int position) {
            return this.fragments.get(position);
        }

        @Override
        public int getCount() {
            return this.fragments.size();
        }

    }
它不起作用。:-p

所以,如何将任务从PageViewActivity的onPageSelected(如AndroMoney应用程序)异步分割。

在片段中公开一个新方法:

public void executeAsyncTask() {
   new AsyncDatabase().execute();
}

在“活动”中,将片段列表设为最终列表,以便您可以在适配器中访问它:

final List<MyFragment> fragments = getFragments();

您还需要更新MyPagerAdapter以使用MyFragment而不是Fragment:

private class MyPageAdapter extends FragmentStatePagerAdapter {
    private List<MyFragment> fragments;

    public MyPageAdapter(FragmentManager fm, List<MyFragment> fragments) {
        super(fm);
        this.fragments = fragments;
    }

    @Override
    public Fragment getItem(int position) {
        return this.fragments.get(position);
    }

    @Override
    public int getCount() {
        return this.fragments.size();
    }

}

private List<MyFragment> getFragments() {
    List<MyFragment> fList = new ArrayList<MyFragment>();

    for (int j = 2; j < 150; j++) {
        fList.add(MyFragment.newInstance(j));
    }

    return fList;
}
私有类MyPageAdapter扩展了FragmentStatePagerAdapter{
私有列表片段;
公共MyPageAdapter(FragmentManager fm,列出片段){
超级(fm);
this.fragments=片段;
}
@凌驾
公共片段getItem(int位置){
返回此.fragments.get(位置);
}
@凌驾
public int getCount(){
返回此.fragments.size();
}
}
私有列表getFragments(){
List fList=new ArrayList();
对于(int j=2;j<150;j++){
add(MyFragment.newInstance(j));
}
回传;
}
public void onPageSelected(int position) {
    fragments.get(position).executeAsyncTask();
}
private class MyPageAdapter extends FragmentStatePagerAdapter {
    private List<MyFragment> fragments;

    public MyPageAdapter(FragmentManager fm, List<MyFragment> fragments) {
        super(fm);
        this.fragments = fragments;
    }

    @Override
    public Fragment getItem(int position) {
        return this.fragments.get(position);
    }

    @Override
    public int getCount() {
        return this.fragments.size();
    }

}

private List<MyFragment> getFragments() {
    List<MyFragment> fList = new ArrayList<MyFragment>();

    for (int j = 2; j < 150; j++) {
        fList.add(MyFragment.newInstance(j));
    }

    return fList;
}