2

ViewPagerを使用して、jsoupでWebサイトから取得したコンテンツを表示しています。 各ページのonCreateViewには、AsyncTaskが呼び出され、データが取得され、ページごとにViewが更新されます。ViewPagerを素早くスライドさせたときのAsyncTaskの実行を避ける

ユーザーがページを通常より速くスライドさせると、AsyncTaskが何度か呼び出され、結果的に有用でないものが最後であるため、jsoupでいくつかの無駄な要求が行われるという問題があります。

私は Fragmentクラスに setUserVisibleHintを使用して Activityクラスで setOnPageChangeListenerを追加しようとしたが、これらの方法は、私は次のページをプリロードの ViewPager行動を失わせるし、私はそれを望んでいません。

ユーザーがスライドを停止したことを知り、その時点でAsynTaskに電話する方法はありますか?

public class ScreenSlidePageFragment extends Fragment { 

    public static final String PAGE_NUMBER = "page"; 

    private int mProblemNumber; 

    public static ScreenSlidePageFragment create(int pageNumber) { 
     ScreenSlidePageFragment fragment = new ScreenSlidePageFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(PAGE_NUMBER, pageNumber); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mPageNumber = getArguments().getInt(PAGE_NUMBER); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     ViewGroup rootView = (ViewGroup) inflater.inflate(
       R.layout.fragment_screen_slide_page, container, false); 
     new GetPageTask(url).execute(); 

     return rootView; 
    } 
} 
+0

ダミーhandler.postdelay(...、delay_ms)またはカウントダウンタイマーを使用しています。 1秒の遅延がうまくいくはずです。フラグメント数が少ない場合は、viewpager.setoffscreenpagelimit(fragments_count)を設定して、一度読み込まれ、毎回変更されたページで初期化されないようにすることができます。 – uguboz

答えて

1

私は最善の方法は、ちょうどAsyncTaskが実行しているかどうかをチェックすることだと思います。 AsyncTaskへの参照を保存してから、ユーザーがこのページにスクロールすると、AsyncTask.Statushttp://developer.android.com/reference/android/os/AsyncTask.Status.html)を使用してステータスを確認できます。

また、ユーザーがあまりにも速くスクロールしたときに新しいタスクを開始したくない場合は、handler.postDelayed(yourRunnable, longMs)を使用できます。以前の保留中のタスクを削除し、longMs時に新しいものをスケジュールします

handler.removeCallbacks(yourRunnable); 
handler.postDelayed(yourRunnable, longMs); 

この方法:たびのユーザーは、あなたがこのような何かを行うことができますページを選択します。例えば。 1000ミリ秒を置くと、ユーザーがページを選択した後にタスクが1秒で開始されます。

+0

私が他の答えにコメントしたように、 'postDelayed'は私が望むことをしません。なぜなら、すべてのスライディングされたページは、指定された時間の後に' AsyncTask'を呼び出すからです。 最初の解決策では、現在のページ以外のAsyncTaskのステータスをチェックすることは可能ですか?もしそうなら、この解決法が有効かもしれません。 –

+0

なぜそれが必要なのかよく分かりませんが、配列やAsyncTaskのリストを持っていて、必要なインスタンスを得るためにフラグメント位置を使うことができます。その配列を囲むフラグメント/アクティビティに入れることができます。 –

0

コンテンツの取得要求を遅らせたい場合があります。たとえば、すばやくスワイプしている場合、(すぐにではなく)コンテンツをロードするために0.5秒間待機すると、システムが呼吸してページがまだ表示されているかどうかを確認できます。このような

何か:

handler.postDelayed(new Runnable(){ 
    if (isVisible){ 
     new GetPageTask(url).execute(); 
    } 
}, 500); 
+0

ありがとう、あなたの答えは 'postDelayed'は私が望むことをしません。なぜなら、すべてのスライスされたページは、指定された時間の後に' AsyncTask'を呼び出すからです。 –

+0

それでしょうか? これがフラグメントが表示されているかどうかを確認する理由です。ユーザーが一連のビューをすばやくスワイプした後にフラグメントが表示されると、タスクが実行されます。さもなければ、あなたはビューをすばやくスワイプし、 'fragment.isVisible()'が失敗するため)何も起こりません。 –

関連する問題