2012-05-22 7 views
8

Necesito una solución para la implementación de la aplicación de buscapersonas. En primer lugar estoy cargando datos enormes de la base de datos en una sola página, por lo que a veces durante el deslizamiento ralentiza la frecuencia de deslizamiento (es necesario deslizar varias veces en la página) ya que en el fondo está haciendo una tarea de búsqueda. No estoy usando una tarea asíncrona para devolver la vista. ¿Hay alguna manera de cargar páginas perezosas? Simplemente permita que el usuario vaya a otra página al deslizar, pero los datos se cargan de forma lenta.android cargar datos de forma asincrónica en la vista del buscapersonas

El código de mi ejemplo es el siguiente;

public Object instantiateItem(View container, int position) { 

View v; 

v = View.inflate(context,R.layout.swipearea, null); 

listView = (ListView)v.findViewById(R.id.MyListView); 
largeDataCall(); 
((ViewPager)container).addView(v); 
return v; 
} 

Lo estoy llamando en el método create.

pager=(ViewPager) findViewById(R.id.pagerAdapter); 
pager.setAdapter(new SimplePager(MyPager.this)); 
pager.setCurrentItem(364); 

¿Hay alguna solución?

Respuesta

0

No creo que haya ninguna forma de cargar datos de forma perezosa de la manera sincrónica que usted describe. AsyncTask es el camino a seguir o quizás podrías usar hilos directamente. Creo que AsyncTask fue diseñado específicamente para este tipo de funcionalidad. Es más fácil usar el hilo directamente. Si necesita ideas sobre la implementación, échele un vistazo a: http://geekjamboree.wordpress.com/2011/11/22/asynctask-call-web-services-in-android/

+1

No puedo ver ninguna implementación de paginador de vista en el enlace dado. – Hanry

+0

Para ver el ejemplo del buscapersonas, puede ver: http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html y http://android-developers.blogspot.in/2011/08/horizontal -view-swiping-with-viewpager.html. Necesita conectar este tipo de implementación con AsyncTask para obtener una experiencia de usuario óptima. –

17

Yo sugeriría trabajar con Fragmentos (y no directamente con vistas).

Hace falta un programa de interfaz de sus fragmentos que decirles cuando se demuestre:

public interface IShowedFragment { 

    public void onShowedFragment(); 
} 

hacer que todos sus fragmentos que implementan la interfaz, y en ese método, llame a las cargadoras/asyncTasks tareas/fondo.

Luego coloque un onPageChangeListener en su ViewPager, y cuando detecte que el usuario cambió la página, llame al método de interfaz en su fragmento. Tiene algunas opciones con este oyente, con uno de los métodos que puede esperar para que viewPager pare de deslizarse para activar su llamada a la interfaz.

Para poder obtener el fragmento correcto para hacer esta llamada, tome el fragmento de suFragmentApadter.instantiateItem (ViewGroup, int) que devolverá el fragmento para esa posición si ya está cargado.

mPager.setOnPageChangeListener(new OnPageChangeListener() { 

    @Override 
    public void onPageSelected(int position) { 

     Fragment fragment = (Fragment) mAdapter.instantiateItem(mPager, position); 
     if(fragment instanceof IShowedFragment){ 
      ((IShowedFragment) fragment).onShowedFragment(); 
     } 
    } 
    (...) 

Al igual que usted puede preparar sus fragmentos con vistas vacías y cuando se desliza en uno, que comenzará a cargar los datos.

+0

¿Tiene alguna implementación de muestra? – Hanry

+3

Los fragmentos harían tu vida mucho más fácil. Si los implementó en un fragmento, puede cargar los datos (de forma asíncrona) siempre que lo desee y luego mostrarlos en CreateView() del Fragmento. http://developer.android.com/reference/android/support/v13/app/FragmentStatePagerAdapter.html – DeeV

+1

Se ha agregado alguna implementación (lo único que falta es un ejemplo de fragmento, donde se implementará onShowedFragment() y se cargarán los datos de forma asíncrona) . – galex

1

instantiateItem se llama cuando el ViewPager está a punto de intercambiar y necesita una vista. No es tiene para realmente crear todo. Creo que al final, la carga lenta está fuera. Como yo lo veo, hay dos cosas que debes hacer aquí.

1: Guarde en caché los datos en segundo plano cuando el usuario esté a punto de llegar a su página. Su ejemplo afirma que 364 páginas (buen Dios), entonces yo diría que use un oyente para manejar los cambios de página. Cuando esté en la página 363, comience a cargar los datos para 364. Cuando se encuentre en 364, comience a cargar los datos en 365 y mantenga los datos en 363 en caso de que el usuario quiera cambiar. Si los datos se cargan con relativa rapidez o el usuario tarda mucho tiempo en intercambiarlos, no debería parecer asumible si está utilizando asyncTask o thread para cargar los datos.

2: Tener una vista de copia de seguridad predeterminada que no se llene hasta que se recuperen los datos. También deberá hacer esto con la opción 1 en caso de que el usuario cargue la página antes de recuperar los datos.Básicamente, solo tiene una vista que diga "cargando ..." o algo así hasta que tenga los datos. O eso, o rellene los datos en tiempo real a medida que los obtiene. En ese caso, el usuario lo verá construir.

De cualquier manera, creo que deberás almacenar en caché algo para que la aplicación se vea bien.

+0

En el registro puedo ver que el paginador de vista comienza a cargar datos para 363,364,365 simultáneamente cuando configuro el elemento actual a 364.entonces no hay un problema para la primera carga pero a medida que el usuario pasa, digamos del 364 al 365 viewpager, comience a cargar datos para la página 366 pero si los datos en la página 366 son muy altos entonces puedo ver que la vista se congela por unos segundos. – Hanry

+0

Entonces eso significa que está cargando los datos de forma sincrónica para tres páginas diferentes en el hilo de la interfaz de usuario, dos de las cuales ni siquiera son visibles. Además, la mitad de tu trabajo está hecho. Use un hilo y debería acelerar las cosas significativamente. – DeeV

+0

Aún necesita una vista predeterminada "no terminado todavía" en caso de que no haya recuperado todos sus datos cuando el usuario pase. – DeeV

0

¿Has mirado en android ignition library? de acuerdo con Sample-applications hay un componente "Lista infinita" y un componente de caché http.

No Lo He probado a mí mismo y No sé si esto es una solución para usted-acabamos de ver los ejemplos .....

3

Me acaban de completar una tarea muy similar. Para comenzar a buscar la solución a su problema, considere los siguientes puntos en orden;

  1. Mira si tiene que ser ir a buscar todos de que los datos en primera instancia. Siéntase libre de publicar de nuevo con algunos detalles sobre qué información necesita cargar y qué está haciendo con ella (¿se muestra como una lista en la pantalla?)
  2. Observe el uso de CursorLoader s que realizan tareas pesadas tales como como la base de datos se obtiene de forma asincrónica. This tutorial en las redes internas presenta el enfoque de Android ContentProvider. Lo mejor es familiarizarse con la documentación oficial de URI y ContentProvider de Android si esos términos no significan mucho.
  3. Si está trabajando con Fragmentos: mire utilizando el FragmentStatePagerAdapter en lugar del FragmentPagerAdapter tradicional. No he usado este adaptador, pero he leído que solo crea una instancia del Fragmento visible actualmente, es decir, no los Fragmentos a la derecha o a la izquierda de la pestaña actualmente seleccionada.
  4. Observe la optimización de la consulta que está ejecutando contra la base de datos.
+0

De acuerdo con Deev. Esta tarea será más fácil (y más estándar) si se usaron Fragmentos para cada página de ViewPager. Cuando se muestre el Fragmento, se llamará a onCreateView, que es donde se pueden inicializar los '' '' CursorLoader''''s, etc., para el acceso db asincrónico y la interfaz de usuario seemless. Esto es ciertamente posible en contra de los comentarios anteriores ya que muchos, muchos otros lo han hecho. – OceanLife

1

Tuve un problema similar. Un visor que estaba cargando datos pesados. Si no va a cambiar las vistas de las páginas individuales a menudo, le sugiero que mantenga las páginas en la memoria. Use siguiente código para realizar esta

mViewPager.setOffscreenPageLimit(#pages); to keep #pages in memory. I had 5 pages so my #pages was 4. 

Si desea actualizar los datos en los toboganes ViewPager, utilice

mViewPager.getAdapter().notifyDataSetChanged(); with getItemPosition() returning POSITION_NONE. 

Y el uso de FragmentStatePagerAdapter.

Cuestiones relacionadas