android - Application crashes when scrolling listview up or down if listAdapter is notified while scrolling and crashes after about 20 seconds without scrolling -


i have listview customlistadapter. updating arraylist new data using handler runs asynktask every 6 seconds , calling notifydatasetchanged() on oppostexcute(). data shown in listview , updated , ok. if scroll listview or down, application crashes.

these global variables:

listview lv1; swiperefreshlayout mswiperefreshlayout; posttask posttask =  new posttask(); stockquotelistadapter stockquotelistadapter; arraylist<stockquote> stockslist=new arraylist<stockquote>(); 

and activity oncreate:

 public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) {      result = inflater.inflate(r.layout.indeces_fragment,container,false);     mswiperefreshlayout = (swiperefreshlayout) result.findviewbyid(r.id.activity_main_swipe_refresh_layout);      lv1 = (listview) result.findviewbyid(r.id.stocks_list);     stockquotelistadapter = new stockquotelistadapter(result.getcontext(), stockslist);     lv1.setadapter(stockquotelistadapter);     mswiperefreshlayout.setcolorschemeresources(r.color.orange, r.color.green, r.color.blue);     mswiperefreshlayout.setonrefreshlistener(new swiperefreshlayout.onrefreshlistener() {         @override         public void onrefresh() {             //mswiperefreshlayout.setrefreshing(false);          }     });      usehandler();     return result; } 

and handler runs asynctask every 6 seconds:

 handler mhandler; public void usehandler() {     mhandler = new handler();     mhandler.postdelayed(mrunnable, 2000); } private runnable mrunnable = new runnable() {     @override     public void run() {             try             {                 new posttask().execute();                 mhandler.postdelayed(mrunnable, 6000);             }             catch (exception ex)             {                 ex.printstacktrace();             }     } }; 

this asynctask:

 private class posttask extends asynctask<void, void, arraylist<stockquote>> {     @override     protected void onpreexecute() {         super.onpreexecute();      }       @override     protected arraylist<stockquote> doinbackground(void... params) {        stockslist.clear();        ....some json parsing here        return stockslist;             }         }catch (exception ex) {             ex.printstacktrace();         }         return null;     }    @override     protected void onpostexecute(arraylist<stockquote> stockslist) {         super.onpostexecute(stockslist);          stockquotelistadapter.notifydatasetchanged();      } 

am doing wrong since im new android.

error:

   on: invalid index 8, size 0         @ java.util.arraylist.throwindexoutofboundsexception(arraylist.java:255)         @ java.util.arraylist.get(arraylist.java:308)         @ profestock.moe.org.swipewithtabs.stocks.stockquotelistadapter.getview(stockquotelistadapter.java:58)         @ android.widget.abslistview.obtainview(abslistview.java:2347)         @ android.widget.listview.makeandaddview(listview.java:1864)         @ android.widget.listview.filldown(listview.java:698)         @ android.widget.listview.fillgap(listview.java:662)         @ android.widget.abslistview.trackmotionscroll(abslistview.java:4991)         @ android.widget.abslistview.scrollifneeded(abslistview.java:3418)         @ android.widget.abslistview.ontouchmove(abslistview.java:3801)         @ android.widget.abslistview.ontouchevent(abslistview.java:3632)         @ android.view.view.dispatchtouchevent(view.java:8471)         @ android.view.viewgroup.dispatchtransformedtouchevent(viewgroup.java:2399)         @ android.view.viewgroup.dispatchtouchevent(viewgroup.java:2092) 

you're getting concurrentmodificationexception because have 2 threads accessing stockslist. doinbackground running on separate thread, , adding data list @ exact same time adapter reading it.

the solution not share arraylist. in doinbackground, should create new arraylist contains new data json. then, in onpostexecute (which gets called on main thread) call stockslist.clear() , add parameter stockslist (which should rename result avoid confusion) this.stockslist before calling notifydatasetchanged().


Comments

Popular posts from this blog

OpenCV OpenCL: Convert Mat to Bitmap in JNI Layer for Android -

android - org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope -

python - How to remove the Xframe Options header in django? -