java - How to fetch data from net faster and display in listView? -
i have news app. app takes time fetch data server , display on listview.but have seen apps flipboard,facebook , game news has more data fetch mine faster.i think app loads entire data , displays entire list together.is there way display list such loads items in listview 1 one?i fetching using asynctaskloader in background.also how display large list of news 100 in list .
mainactivity:
package com.example.android.gametalks; import android.app.loadermanager; import android.content.intent; import android.content.loader; import android.net.uri; import android.support.v7.app.appcompatactivity; import android.os.bundle; import android.view.view; import android.widget.adapterview; import android.widget.listview; import java.util.arraylist; import java.util.list; public class mainactivity extends appcompatactivity implements loadermanager.loadercallbacks<list<gamenews>> { //ign url final string ign_url = "https://newsapi.org/v1/articles?source=ign&sortby=top&apikey=679f6fb918d34343b18590ca70f7fcde"; final string google_url = " https://newsapi.org/v1/articles?source=google-news&sortby=top&apikey=679f6fb918d34343b18590ca70f7fcde"; final string engadget_url = "https://newsapi.org/v1/articles?source=engadget&sortby=top&apikey=679f6fb918d34343b18590ca70f7fcde"; gameadapter adapter ; private view progressbar; final private int game_loader = 0; arraylist<string> urls = new arraylist<>(); @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); urls.add(ign_url); urls.add(google_url); urls.add(engadget_url); //getting listview listview gamelistview = (listview) findviewbyid(r.id.listview); //progress bar finding progressbar = findviewbyid(r.id.progress_bar); arraylist<gamenews> gamelist = new arraylist<>(); //making new arrayadapter adapter = new gameadapter(this,gamelist); //connecting arrayadapter listview gamelistview.setadapter(adapter); getloadermanager().initloader(game_loader, null, this); //listview item click listner gamelistview.setonitemclicklistener(new adapterview.onitemclicklistener() { @override public void onitemclick(adapterview<?> adapterview, view view, int i, long l) { gamenews currentearthquake = adapter.getitem(i); string url = currentearthquake.geturl(); intent intent = new intent(intent.action_view); intent.setdata(uri.parse(url)); startactivity(intent); } }); } @override public loader<list<gamenews>> oncreateloader(int i, bundle bundle) { return new gameloader(this,urls); } @override public void onloadfinished(loader<list<gamenews>> loader, list<gamenews> games) { progressbar.setvisibility(view.invisible); adapter.clear(); if(games == null) { return; } adapter.addall(games); } @override public void onloaderreset(loader<list<gamenews>> loader) { adapter.clear(); } } gameloader:
package com.example.android.gametalks; import android.content.asynctaskloader; import android.content.context; import java.util.arraylist; import java.util.list; /** * created apple on 9/8/17. */ public class gameloader extends asynctaskloader<list<gamenews>> { private arraylist<string> urls = new arraylist<>(); public gameloader(context context, arraylist<string> url) { super(context); urls = url; } @override protected void onstartloading() { forceload(); } @override public list<gamenews> loadinbackground() { if(urls == null) { return null; } // perform http request earthquake data , process response. list<gamenews> games = queryutils.fetchearthquakedata(urls); return games; } } queryutils(here network fetching takes place):
package com.example.android.gametalks; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.util.log; import android.widget.listview; import org.json.jsonarray; import org.json.jsonexception; import org.json.jsonobject; import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstream; import java.io.inputstreamreader; import java.net.httpurlconnection; import java.net.malformedurlexception; import java.net.url; import java.nio.charset.charset; import java.text.simpledateformat; import java.util.arraylist; import java.util.date; import java.util.list; /** * helper methods related requesting , receiving earthquake data usgs. */ public final class queryutils { private static final string log_tag = queryutils.class.getsimplename(); /** * create private constructor because no 1 should ever create {@link queryutils} object. * class meant hold static variables , methods, can accessed * directly class name queryutils (and object instance of queryutils not needed). */ private queryutils() { } public static list<gamenews> fetchearthquakedata(arraylist<string> url) { list<gamenews> games ; list<gamenews> total = new arraylist<>(); url url; log.d(log_tag,url.get(0)); for(int = 0 ; < url.size(); i++) { url = createurl(url.get(i)); try { //make http request string jsonresponse = makehttprequest(url); games = extractfeaturefromjson(jsonresponse); total.addall(games); } catch (ioexception e) { log.e("ioexception", "" + e); } } return total; } private static url createurl(string stringurl) { url url = null; try { url = new url(stringurl); } catch (malformedurlexception e) { log.e(log_tag, "error creating url ", e); } return url; } private static string makehttprequest(url url) throws ioexception { string jsonresponse = ""; inputstream inputstream = null; httpurlconnection urlconnection = null; try { urlconnection = (httpurlconnection) url.openconnection(); if (urlconnection.getresponsecode() == 200) { inputstream = urlconnection.getinputstream(); jsonresponse = readinputstream(inputstream); } else { log.e(log_tag, "" + urlconnection.getresponsecode()); return null; } } catch (ioexception e) { log.d(log_tag, "" + e); } { if (urlconnection != null) { urlconnection.disconnect(); } if (inputstream != null) { // function must handle java.io.ioexception here inputstream.close(); } } return jsonresponse; } private static string readinputstream(inputstream inputstream) throws ioexception { stringbuilder output = new stringbuilder(); if (inputstream != null) { inputstreamreader inputstreamreader = new inputstreamreader(inputstream, charset.forname("utf-8")); bufferedreader reader = new bufferedreader(inputstreamreader); string line = reader.readline(); while (line != null) { output.append(line); line = reader.readline(); } } return output.tostring(); } private static arraylist<gamenews> extractfeaturefromjson(string jsonresponse) { arraylist<gamenews> games = new arraylist<>(); try { jsonobject jsonobject = new jsonobject(jsonresponse); jsonarray articles = jsonobject.getjsonarray("articles"); (int = 0; < articles.length(); i++) { jsonobject currentgame = articles.getjsonobject(i); // extract value key called "mag" string title = currentgame.getstring("title"); // extract value key called "place" string description = currentgame.getstring("description"); // extract value key called "url" string url = currentgame.getstring("url"); //extract value key called urltoimage string urltoimage = "nn"; urltoimage = currentgame.getstring("urltoimage"); url urlofimage = null; bitmap bmp = null; try { urlofimage = new url(urltoimage); } catch (malformedurlexception e) { e.printstacktrace(); } try { bmp = bitmapfactory.decodestream(urlofimage.openconnection().getinputstream()); } catch (ioexception e) { e.printstacktrace(); } // create new {@link earthquake} object magnitude, location, time, // , url json response. gamenews game = new gamenews(title, description,bmp,url); // add new {@link earthquake} list of earthquakes. games.add(game); } } catch (jsonexception e) { log.d(log_tag, "" + e); } return games; } } thanks in advance.
Comments
Post a Comment