Java 如何将任务异步到ViewPager的onPageSelected中的片段?
我是Android编程新手。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文档,但没有任何帮助,或者可能我理解得不好。
我正试图通过从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;
}