¿Cómo es posible tener feeds de diferentes Urls en el mismo ListView
Con mi proyecto actual, puedo tomar datos de una sola URL y luego mostrarlos en mi Lista personalizada. ¿Así que hay una manera de obtener datos de más de una Url y luego poner en el mismo ListView, incluso si los datos de cada Url se llaman de manera diferente? Este es mi código que me permite tener los elementos de una URL:
public class CLASS1 extends Fragment { private RSSFeed myRssFeed = null; public CLASS1() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tab1, null); if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); } try { URL rssUrl = new URL("URL"); SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance(); SAXParser mySAXParser = mySAXParserFactory.newSAXParser(); XMLReader myXMLReader = mySAXParser.getXMLReader(); RSSHandler myRSSHandler = new RSSHandler(); myXMLReader.setContentHandler(myRSSHandler); InputSource myInputSource = new InputSource(rssUrl.openStream()); myXMLReader.parse(myInputSource); myRssFeed = myRSSHandler.getFeed(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (myRssFeed!=null) { ListView list = (ListView)view.findViewById(android.R.id.list); CustomList adapter = new CustomList(getActivity(),myRssFeed.getList()); adapter.addAll(); list.setAdapter(adapter); } else Toast.makeText(getActivity(), "Spiacente, connessione non disponibile!" + " Prova più tardi.", Toast.LENGTH_LONG).show(); return view; } }
- ¿Cómo comprobar el nombre de dominio dado http o https en java?
- Cómo obtener datos de una url
- ¿Cómo puedo iniciar una URL desde mi aplicación en Android?
- Problema al extraer el número de puerto con URL.getPort () cuando la URL contiene "]"
- Vista previa de una URL en android, como lo hace facebook antes de publicar un enlace (Link Preview)
- ¿Cómo evitar la redirección de Url?
- ¿Cómo puedo descifrar la URL en la aplicación Android
- ¿Cómo puedo iniciar mi aplicación a través de una URL personalizada en un correo electrónico
- Aplicación de Android Market Url?
- ¿Cuál es la historia con el espacio de nombres XML de Android?
- ¿Cómo puedo obtener la url correcta en el archivo de video de un video incrustado?
- Imageloader sólo carga imágenes en la lista después de listitem ha salido de la pantalla
- Imágenes extraíbles de Android de la URL
Estoy haciendo exactamente esto en mi aplicación,
Esto es cómo estoy haciendo esto, he creado AsyncTask
para analizar RSS, y utilizando un bucle para pasar diferentes URL para ser analizados a AysncTask
.
Aquí es lo que quiero decir,
Esta es la matriz de URL,
private String[] newsURLs = { "url1", "url2", "url3" };
Así es como los estoy ejecutando,
//GetNews is AsyncTask class for (int i = 0; i < newsURLs.length; i++) { GetNews blog = new GetNews(i); blog.execute(); }
En el código anterior i
es el número de URL pasado como constructor en la clase AsyncTask
.
Aquí está mi constructor en AsyncTask
clase,
int number; public GetNews(int urlNumber) { number = urlNumber; }
Y cargar la URL en el AsyncTask
doInBackground()
esta manera,
URL feedURL = new URL(newsURLs[number]); HttpURLConnection connection; connection = (HttpURLConnection) feedURL.openConnection(); connection.setConnectTimeout(8000); connection.connect();
Después de eso, estoy usando SAXParser
para analizar xml
basado en mi necesidad.
Tenga en cuenta que si desea una ejecución paralela, reemplace blog.execute();
con
blog.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); // this type of executor uses the following params: // // private static final int CORE_POOL_SIZE = 5; // private static final int MAXIMUM_POOL_SIZE = 128; // private static final int KEEP_ALIVE = 1; // // private static final ThreadFactory sThreadFactory = new ThreadFactory() { // private final AtomicInteger mCount = new AtomicInteger(1); // // public Thread newThread(Runnable r) { // return new Thread(r, "AsyncTask #" + mCount.getAndIncrement()); // } // }; // // private static final BlockingQueue<Runnable> sPoolWorkQueue = // new LinkedBlockingQueue<Runnable>(10);
También tenga en cuenta que,
Cuando se introdujo por primera vez, AsyncTasks se ejecutaron en serie en un solo hilo de fondo. Comenzando
Con DONUT, esto fue cambiado a un grupo de hilos permitiendo múltiples tareas para operar en paralelo. Después de HONEYCOMB, se planea cambiar esto de nuevo a un solo hilo para evitar errores comunes de aplicación causados por la ejecución paralela. Si realmente desea una ejecución paralela, puede utilizar la versión executeOnExecutor (Executor, Params …) de este método con THREAD_POOL_EXECUTOR; Sin embargo, ver comentarios allí para advertencias sobre su uso.
DONUT es Android 1.6, HONEYCOMB es Android 3.0.
También puede ejecutar la tarea en función de la versión que tenga,
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { blog.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } else { blog.execute(); }
Este es mi código parcial para mostrar lo que estoy haciendo,
// This is my Main class private String[] newsURLs = { "url1", "url2", "url3" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_myapp); for (int i = 0; i < newsURLs.length; i++) { GetNews blog = new GetNews(i); blog.execute(); } } }
Esta es la clase AsyncTask
(código parcial),
private class GetNews extends AsyncTask<Object, Void, Void> { protected int number; public GetNews(int urlNumber) { number = urlNumber; } @Override protected void doInBackground( Object... arg0) { try { // Check if the feed is Live URL feedURL = new URL(newsURLs[number]); HttpURLConnection connection; connection = (HttpURLConnection) feedURL.openConnection(); connection.setConnectTimeout(8000); connection.connect();
- Gradle no puede encontrar android_native_app_glue
- El estilo de Button es añadir atributo desconocido – Android