android - App force close without internet JSON -
im making app using json on first activity when app open without internet conection app make "force close", dont know have ovoid error, help, im new on android , java
public class mainactivity extends actionbaractivity {
string titles[] = {"que es cmx","ejecutivos(as)","nuestros servicios","soluciones tu medida","certificaciones vigentes", "cursos online", "", "", "", ""}; int icons[] = {r.mipmap.organization,r.mipmap.conference,r.mipmap.services,r.mipmap.approval,r.mipmap.diploma1,r.mipmap.donate,r.id.linea,r.id.linea,r.id.linea,r.mipmap.home}; string name = "john doe"; string email = "johndoe@cmx.org.mx"; int profile = r.drawable.profile1; private toolbar toolbar; // declaring toolbar object recyclerview mrecyclerview; // declaring recyclerview recyclerview.adapter madapter; // declaring adapter recycler view recyclerview.layoutmanager mlayoutmanager; // declaring layout manager linear layout manager drawerlayout drawer; // declaring drawerlayout actionbardrawertoggle mdrawertoggle; // declaring action bar drawer toggle // declare variables jsonobject jsonobject; jsonarray jsonarray; listview listview; listviewadapter adapter; progressdialog mprogressdialog; arraylist<hashmap<string, string>> arraylist; static string rank = "title"; static string country = "place"; static string population = "date"; static string content1 = "content1"; static string content2 = "content2"; static string flag = "imagen"; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); // view listview_main.xml setcontentview(r.layout.listview_main); // execute downloadjson asynctask new downloadjson().execute(); toolbar = (toolbar) findviewbyid(r.id.tool_bar); setsupportactionbar(toolbar); settitle(r.string.title_activity_main); mrecyclerview = (recyclerview) findviewbyid(r.id.recyclerview); // assigning recyclerview object xml view mrecyclerview.sethasfixedsize(true); // letting system know list objects of fixed size madapter = new myadapter(titles,icons,name,email,profile,this); // creating adapter of myadapter class(which going see in bit) // , passing titles,icons,header view name, header view email, // , header view profile picture mrecyclerview.setadapter(madapter); // setting adapter recyclerview final gesturedetector mgesturedetector = new gesturedetector(mainactivity.this, new gesturedetector.simpleongesturelistener() { @override public boolean onsingletapup(motionevent e) { return true; } }); mrecyclerview.addonitemtouchlistener(new recyclerview.onitemtouchlistener() { @override public boolean onintercepttouchevent(recyclerview recyclerview, motionevent motionevent) { view child = recyclerview.findchildviewunder(motionevent.getx(),motionevent.gety()); if(child !=null && mgesturedetector.ontouchevent(motionevent)){ drawer.closedrawers(); if (recyclerview.getchildposition(child) == 0) { intent intent = new intent(mainactivity.this, profile.class); startactivity(intent); finish(); }else if (recyclerview.getchildposition(child) == 1) { intent intent = new intent(mainactivity.this, cmx.class); startactivity(intent); finish(); }else if (recyclerview.getchildposition(child) == 2) { intent intent = new intent(mainactivity.this, ejecutivos.class); startactivity(intent); finish(); }else if (recyclerview.getchildposition(child) == 3){ intent intent = new intent(mainactivity.this, servicios.class); startactivity(intent); finish(); }else if (recyclerview.getchildposition(child) == 4){ intent intent = new intent(mainactivity.this, soluciones.class); startactivity(intent); finish(); }else if (recyclerview.getchildposition(child) == 5) { intent intent = new intent(mainactivity.this, certificaciones.class); startactivity(intent); finish(); }else if (recyclerview.getchildposition(child) == 6){ intent intent = new intent(mainactivity.this, web.class); startactivity(intent); finish(); }else if (recyclerview.getchildposition(child) == 8 ){ intent intent = new intent(mainactivity.this, mainactivity.class); startactivity(intent); finish(); } return true; } return false; } @override public void ontouchevent(recyclerview recyclerview, motionevent motionevent) { } }); mlayoutmanager = new linearlayoutmanager(this); // creating layout manager mrecyclerview.setlayoutmanager(mlayoutmanager); // setting layout manager drawer = (drawerlayout) findviewbyid(r.id.drawerlayout); // drawer object assigned view mdrawertoggle = new actionbardrawertoggle(this,drawer,toolbar,r.string.opendrawer,r.string.closedrawer){ @override public void ondraweropened(view drawerview) { super.ondraweropened(drawerview); // code here execute once drawer opened( dont want happened whe drawer // open not going put here) } @override public void ondrawerclosed(view drawerview) { super.ondrawerclosed(drawerview); // code here execute once drawer closed } }; // drawer toggle object made drawer.setdrawerlistener(mdrawertoggle); // drawer listener set drawer toggle mdrawertoggle.syncstate(); // set drawer toggle sync state } // downloadjson asynctask private class downloadjson extends asynctask<void, void, void> { @override protected void onpreexecute() { super.onpreexecute(); // create progressdialog mprogressdialog = new progressdialog(mainactivity.this); // set progressdialog message mprogressdialog.setmessage("cargando..."); mprogressdialog.setindeterminate(false); // show progressdialog mprogressdialog.show(); } @override protected void doinbackground(void... params) { // create array arraylist = new arraylist<hashmap<string, string>>(); // retrieve json objects given url address jsonobject = jsonfunctions.getjsonfromurl("http://cmx.org.mx/wp-content/uploads/json.txt"); try { // locate array name in json jsonarray = jsonobject.getjsonarray("posts"); (int = 0; < jsonarray.length(); i++) { hashmap<string, string> map = new hashmap<string, string>(); jsonobject = jsonarray.getjsonobject(i); // retrive json objects map.put("title", jsonobject.getstring("title")); map.put("place", jsonobject.getstring("place")); map.put("date", jsonobject.getstring("date")); map.put("content1", jsonobject.getstring("content1")); map.put("content2", jsonobject.getstring("content2")); map.put("imagen", jsonobject.getstring("imagen")); // set json objects array arraylist.add(map); } } catch (jsonexception e) { log.e("error", e.getmessage()); e.printstacktrace(); } return null; } @override protected void onpostexecute(void args) { // locate listview in listview_main.xml listview = (listview) findviewbyid(r.id.listview); // pass results listviewadapter.java adapter = new listviewadapter(mainactivity.this, arraylist); // set adapter listview listview.setadapter(adapter); // close progressdialog mprogressdialog.dismiss(); } } @override public boolean oncreateoptionsmenu(menu menu) { // inflate menu; adds items action bar if present. getmenuinflater().inflate(r.menu.menu_main, menu); return true; } public boolean onoptionsitemselected(menuitem item) { // handle action bar item clicks here. action bar // automatically handle clicks on home/up button, long // specify parent activity in androidmanifest.xml. int id = item.getitemid(); //noinspection simplifiableifstatement if (id == r.id.action_settings) { return true; } if (mdrawertoggle.onoptionsitemselected(item)) { return true; } switch (item.getitemid()) { // respond action bar's up/home button case r.id.about: intent intent = new intent(mainactivity.this, about.class); startactivity(intent); return true; } return super.onoptionsitemselected(item); } }
public class jsonfunctions { public static jsonobject getjsonfromurl(string url) { inputstream = null; string result = ""; jsonobject jarray = null; // download json data url try { httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(url); httpresponse response = httpclient.execute(httppost); httpentity entity = response.getentity(); = entity.getcontent(); } catch (exception e) { log.e("log_tag", "error in http connection " + e.tostring()); } // convert response string try { bufferedreader reader = new bufferedreader(new inputstreamreader( is, "iso-8859-1"), 8); stringbuilder sb = new stringbuilder(); string line = null; while ((line = reader.readline()) != null) { sb.append(line + "\n"); } is.close(); result = sb.tostring(); } catch (exception e) { log.e("log_tag", "error converting result " + e.tostring()); } try { jarray = new jsonobject(result); } catch (jsonexception e) { log.e("log_tag", "error parsing data " + e.tostring()); } return jarray; } } -edit
logcat: https://goo.gl/n1yq9t
update1:
@override protected void doinbackground(void... params) { // create array arraylist = new arraylist<hashmap<string, string>>(); // retrieve json objects given url address jsonobject = jsonfunctions.getjsonfromurl("http://cmx.org.mx/wp-content/uploads/json.txt"); if(jsonobject==null){ toast.maketext(getapplicationcontext(), "no internet", toast.length_long).show(); }else{ try { // locate array name in json jsonarray = jsonobject.getjsonarray("posts"); (int = 0; < jsonarray.length(); i++) { hashmap<string, string> map = new hashmap<string, string>(); jsonobject = jsonarray.getjsonobject(i); // retrive json objects map.put("title", jsonobject.getstring("title")); map.put("place", jsonobject.getstring("place")); map.put("date", jsonobject.getstring("date")); map.put("content1", jsonobject.getstring("content1")); map.put("content2", jsonobject.getstring("content2")); map.put("imagen", jsonobject.getstring("imagen")); // set json objects array arraylist.add(map); } } catch (jsonexception e) { log.e("error", e.getmessage()); e.printstacktrace(); } } return null; } myadapter:
public class myadapter extends recyclerview.adapter<myadapter.viewholder> { private static final int type_header = 0; // declaring variable understand view being worked on // if view under inflation , population header or item private static final int type_item = 1; private string mnavtitles[]; // string array store passed titles value mainactivity.java private int micons[]; // int array store passed icons resource value mainactivity.java private string name; //string resource header view name private int profile; //int resource header view profile picture private string email; //string resource header view email context context; // creating viewholder extends recyclerview view holder // viewholder used to store inflated views in order recycle them public static class viewholder extends recyclerview.viewholder implements view.onclicklistener { int holderid; textview textview; imageview imageview; imageview profile; textview name; textview email; context contxt; public viewholder(view itemview,int viewtype,context c) { // creating viewholder constructor view , viewtype parameter super(itemview); contxt = c; itemview.setclickable(true); itemview.setonclicklistener(this); // here set appropriate view in accordance the view type passed when holder object created if(viewtype == type_item) { textview = (textview) itemview.findviewbyid(r.id.rowtext); // creating textview object id of textview item_row.xml imageview = (imageview) itemview.findviewbyid(r.id.rowicon);// creating imageview object id of imageview item_row.xml holderid = 1; // setting holder id 1 object being populated of type item row } else{ name = (textview) itemview.findviewbyid(r.id.name); // creating text view object header.xml name email = (textview) itemview.findviewbyid(r.id.email); // creating text view object header.xml email profile = (imageview) itemview.findviewbyid(r.id.circleview);// creating image view object header.xml profile pic holderid = 0; // setting holder id = 0 object being populated of type header view } } @override public void onclick(view v) { toast.maketext(contxt, "the item clicked is: " + getposition(), toast.length_short).show(); } } myadapter(string titles[],int icons[],string name,string email, int profile, context passedcontext){ // myadapter constructor titles , icons parameter // titles, icons, name, email, profile pic passed main activity mnavtitles = titles; //have seen earlier micons = icons; name = name; email = email; profile = profile; this.context = passedcontext; //here assign passed values values declared here //in adapter } //below first ovverride method oncreateviewholder called when viewholder //created, in method inflate item_row.xml layout if viewtype type_item or else inflate header.xml // if viewtype type_header // , pass view holder @override public myadapter.viewholder oncreateviewholder(viewgroup parent, int viewtype) { if (viewtype == type_item) { view v = layoutinflater.from(parent.getcontext()).inflate(r.layout.item_row,parent,false); //inflating layout viewholder vhitem = new viewholder(v,viewtype,context); //creating viewholder , passing object of type view return vhitem; // returning created object //inflate layout , pass view holder } else if (viewtype == type_header) { view v = layoutinflater.from(parent.getcontext()).inflate(r.layout.header,parent,false); //inflating layout viewholder vhheader = new viewholder(v,viewtype,context); //creating viewholder , passing object of type view return vhheader; //returning object created } return null; } //next override method called when item in row needed displayed, here int position // tells item @ position being constructed displayed , holder id of holder object tell // view type being created 1 item row @override public void onbindviewholder(myadapter.viewholder holder, int position) { if(holder.holderid ==1) { // list view going called after header view decrement // position 1 , pass holder while setting text , image holder.textview.settext(mnavtitles[position - 1]); // setting text array of our titles holder.imageview.setimageresource(micons[position -1]);// settimg image array of our icons } else{ holder.profile.setimageresource(profile); // set resources header view holder.name.settext(name); holder.email.settext(email); } } // method returns number of items present in list @override public int getitemcount() { return mnavtitles.length+1; // number of items in list +1 titles including header view. } // witht following method check type of view being passed @override public int getitemviewtype(int position) { if (ispositionheader(position)) return type_header; return type_item; } private boolean ispositionheader(int position) { return position == 0; }
your method getjsonfromurl() catches exceptions can think of, issue not there.
the issue returns null when exception has been caught.
so jsonobject null when have no internet, , you're accessing if it's not null @ jsonobject.getjsonarray("posts").
i suggest check if jsonobject == null after line jsonobject = jsonfunctions.getjsonfromurl(...);
edit (following comment):
the error due line of code in mainactivity. int icons[] = {r.mipmap.organization,r.mipmap.conference,r.mipmap.services,r.mipmap.approval,r.mipmap.diploma1,r.mipmap.donate,r.id.linea,r.id.linea,r.id.linea,r.mipmap.home};
all items in icons array should either r.mipmap.xxxx or r.drawable.xxxx, , not r.id.xxxx or others. see if issue, replace r.id.linea r.mipmap.conference testing purposes, , let know happens then.
Comments
Post a Comment