unos tipos saber rapido rapida que porque para otros mundo mejor mas como celulares celular cargan cargadores cargador carga cables cable buenos android list android-4.0 android-3.0-honeycomb

tipos - Cargadores de Android, ¿el camino a seguir?



porque unos cables usb cargan mas rapido que otros (2)

En caso de que alguien esté buscando la versión del cargador de mi ejemplo anterior: aquí está:

package com.sof.test.loader; import java.util.ArrayList; import android.app.LoaderManager; import java.util.List; import android.app.ListActivity; import android.content.AsyncTaskLoader; import android.content.Context; import android.content.Loader; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.ArrayAdapter; import android.widget.TextView; /** The activity. */ public class LoaderTestActivity2 extends ListActivity implements LoaderManager.LoaderCallbacks<List<Person>> { private DataSourceOrDomainModel dataSourceOrDomainModel = new DataSourceOrDomainModel(); private List<Person> listPerson; private PersonListAdapter personListAdapter; private TextView emptyView; private Loader<List<Person>> personLoader; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); listPerson = new ArrayList<Person>(); personListAdapter = new PersonListAdapter(listPerson); setListAdapter(personListAdapter); personLoader = new PersonLoader(this, dataSourceOrDomainModel, new ProgressHandler() ); setUpEmptyView(); getLoaderManager().initLoader(0, null, this); personLoader.forceLoad(); } public void setUpEmptyView() { emptyView = new TextView(this); emptyView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); emptyView.setVisibility(View.GONE); ((ViewGroup) getListView().getParent()).addView(emptyView); getListView().setEmptyView(emptyView); } public void publishProgress(int progress) { emptyView.setText("Loading data :" + String.valueOf(progress) + " %"); } @Override public Loader<List<Person>> onCreateLoader(int arg0, Bundle arg1) { return personLoader; } @Override public void onLoadFinished(Loader<List<Person>> personLoader, List<Person> result) { listPerson.clear(); listPerson.addAll(result); personListAdapter.notifyDataSetChanged(); } @Override public void onLoaderReset(Loader<List<Person>> arg0) { listPerson.clear(); personListAdapter.notifyDataSetChanged(); } /** List item view factory : the adapter. */ private class PersonListAdapter extends ArrayAdapter<Person> { public PersonListAdapter(List<Person> listPerson) { super(LoaderTestActivity2.this, 0, listPerson); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = new PersonView(getContext()); } PersonView personView = (PersonView) convertView; personView.setPerson((Person) getItem(position)); return personView; } } private class ProgressHandler implements ProgressListener { @Override public void personLoaded(final int count, final int total) { runOnUiThread( new Runnable() { @Override public void run() { publishProgress(100 * count / total); } }); } } } class PersonLoader extends AsyncTaskLoader<List<Person>> { private DataSourceOrDomainModel dataSourceOrDomainModel; private ProgressListener progressHandler; public PersonLoader(Context context, DataSourceOrDomainModel dataSourceOrDomainModel, ProgressListener progressHandler ) { super(context); this.dataSourceOrDomainModel = dataSourceOrDomainModel; this.progressHandler = progressHandler; } @Override public List<Person> loadInBackground() { return dataSourceOrDomainModel.getListPerson( progressHandler ); } }

Sería más difícil agregar soporte (librairy de soporte) a este ejemplo, ya que no hay un equivalente de ListAcitivity en el librairy de soporte. Tendría que crear un ListFragment o crear un FragmentActivity y darle un diseño que incluya una lista.

Estoy acostumbrado a construir listas en Android utilizando adaptadores. Si necesito algunos datos de larga duración para obtener, utilizo un asynctask, o un ejecutable simple, para actualizar la estructura de datos en la que se basa el adaptador, y llamar a notificationDataChanged en el adaptador.

Aunque no es sencillo, finalmente encuentro que este es un modelo simple y permite una buena separación de la presentación lógica (en asynctask, actualizar una estructura de datos) y la vista (un adaptador que actúa como fábrica de vistas, en su mayoría).

Sin embargo, recientemente leí acerca de los cargadores introducidos en HoneyComb e incluidos en la biblioteca de compatibilidad con versiones anteriores, los probé y encontré la introducción de mucha complejidad. Son difíciles de manejar y agregan algún tipo de magia a todo este proceso a través de los administradores de cargadores, agregan mucho código y no disminuyen el número de clases o elementos de colaboración, pero puedo estar equivocado y me gustaría escuchar algunos puntos positivos cargadoras

  • ¿Cuáles son las ventajas de los cargadores en términos de líneas de código, claridad y esfuerzo?
  • ¿Cuáles son las ventajas de los cargadores en términos de separación de roles durante la carga de datos, o más ampliamente, en términos de diseño?
  • ¿Son el camino a seguir, debo reemplazar toda la carga de datos de mi lista para implementarlos a través de los cargadores?

Ok, este es un foro de desarrolladores, así que aquí hay un ejemplo. Por favor, hazlo mejor con los cargadores:

package com.sof.test.loader; import java.util.ArrayList; import java.util.List; import android.app.ListActivity; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.ArrayAdapter; import android.widget.TextView; /** The activity. */ public class LoaderTestActivity extends ListActivity { private DataSourceOrDomainModel dataSourceOrDomainModel = new DataSourceOrDomainModel(); private List<Person> listPerson; private PersonListAdapter personListAdapter; private TextView emptyView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); listPerson = new ArrayList<Person>(); personListAdapter = new PersonListAdapter( listPerson ); setListAdapter( personListAdapter ); setUpEmptyView(); new PersonLoaderThread().execute(); } public void setUpEmptyView() { emptyView = new TextView( this ); emptyView.setLayoutParams( new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT ) ); emptyView.setVisibility(View.GONE); ((ViewGroup)getListView().getParent()).addView(emptyView); getListView().setEmptyView(emptyView); } /** Simulate a long task to get data. */ private class PersonLoaderThread extends AsyncTask<Void, Integer, List<Person>> { @Override protected List<Person> doInBackground(Void... params) { return dataSourceOrDomainModel.getListPerson( new ProgressHandler()); } @Override protected void onProgressUpdate(Integer... values) { emptyView.setText( "Loading data :" + String.valueOf( values[ 0 ] ) +" %" ); } @Override protected void onPostExecute(List<Person> result) { listPerson.clear(); listPerson.addAll( result ); personListAdapter.notifyDataSetChanged(); } private class ProgressHandler implements ProgressListener { @Override public void personLoaded(int count, int total) { publishProgress( 100*count / total ); } } } /** List item view factory : the adapter. */ private class PersonListAdapter extends ArrayAdapter<Person> { public PersonListAdapter( List<Person> listPerson ) { super(LoaderTestActivity.this, 0, listPerson ); } @Override public View getView(int position, View convertView, ViewGroup parent) { if( convertView == null ) { convertView = new PersonView( getContext() ); } PersonView personView = (PersonView) convertView; personView.setPerson( (Person) getItem(position) ); return personView; } } }

Una pequeña interfaz de devolución de llamada para el progreso

package com.sof.test.loader; /** Callback handler during data load progress. */ public interface ProgressListener { public void personLoaded(int count, int total ); }

Un widget de elemento de lista

package com.sof.test.loader; import com.sof.test.loader.R; import android.content.Context; import android.view.LayoutInflater; import android.widget.LinearLayout; import android.widget.TextView; /** List Item View, display a person */ public class PersonView extends LinearLayout { private TextView personNameView; private TextView personFirstNameView; public PersonView(Context context) { super(context); LayoutInflater inflater= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate( R.layout.person_view,this ); personNameView = (TextView) findViewById( R.id.person_name ); personFirstNameView = (TextView) findViewById( R.id.person_firstname ); } public void setPerson( Person person ) { personNameView.setText( person.getName() ); personFirstNameView.setText( person.getFirstName() ); } }

Es xml: res / person_view.xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/person_view" android:layout_width="fill_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/person_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" /> <TextView android:id="@+id/person_firstname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/person_name" /> </RelativeLayout>

La fuente de datos o modelo, proporcionando datos (lentamente)

package com.sof.test.loader; import java.util.ArrayList; import java.util.List; /** A source of data, can be a database, a WEB service or a model. */ public class DataSourceOrDomainModel { private static final int PERSON_COUNT = 100; public List<Person> getListPerson( ProgressListener listener ) { List<Person> listPerson = new ArrayList<Person>(); for( int i=0; i < PERSON_COUNT ; i ++ ) { listPerson.add( new Person( "person", "" + i ) ); //kids, never do that at home ! pause(); if( listener != null ) { listener.personLoaded(i,PERSON_COUNT); }//if } return listPerson; }//met private void pause() { try { Thread.sleep( 100 ); } catch (InterruptedException e) { e.printStackTrace(); } } }

El POJO representando a una persona:

package com.sof.test.loader; /** A simple POJO to be displayed in a list, can be manipualted as a domain object. */ public class Person { private String name; private String firstName; public Person(String name, String firstName) { this.name = name; this.firstName = firstName; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } }//class


Un problema que su código tiene que los cargadores intentan solucionar es qué sucede si se reinicia su actividad (por ejemplo, debido a la rotación del dispositivo o al cambio de configuración) mientras su tarea asíncrona aún está en progreso en su caso, su actividad reiniciada iniciará una segunda instancia de la tarea y eliminará los resultados de la primera. Cuando se completa la primera, puede terminar con bloqueos debido a que su tarea asíncrona tiene una referencia y ahora es una actividad terminada.

Y sí, el uso de cargadores a menudo genera un código más / más complejo, especialmente si no puede usar uno de los cargadores provistos.