java - The application App(process com.example.app) has stopped unexpectedly -
my problem: want set visibility of imageview on random basis. mean each image view visible randomly after few milliseconds my app unexpectedly crashes time. though, i'm new android development @ java j2se. please tell me i'm doing blunder or mistake chance? please! in advance!
package com.example.app; import java.util.random; import android.os.bundle; import android.app.activity; import android.view.menu; import android.view.view; import android.widget.button; import android.widget.imageview; import android.widget.textview; public class mainactivity extends activity { private button b; public imageview i1; public imageview i2; public imageview i3; public imageview i4; public textview t; public textview s; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); i1=new imageview(this); i1=(imageview) findviewbyid(r.id.imag1); i1.setvisibility(view.invisible); i2=new imageview(this); i2=(imageview) findviewbyid(r.id.imag2); i2.setvisibility(view.invisible); i3=new imageview(this); i3=(imageview) findviewbyid(r.id.imag3); i3.setvisibility(view.invisible); i4=new imageview(this); i4=(imageview) findviewbyid(r.id.imag4); i4.setvisibility(view.invisible); t=(textview)findviewbyid(r.id.time); s=(textview)findviewbyid(r.id.score); thread t=new thread(new mythread()); t.start(); } @override public boolean oncreateoptionsmenu(menu menu) { // inflate menu; adds items action bar if present. getmenuinflater().inflate(r.menu.main, menu); return true; } private class mythread implements runnable{ random randomgenerator = new random(); int n; public void run(){ while(true){ n=randomgenerator.nextint(8); if(n==1){ i1.setvisibility(view.visible); } if(n==2){ i2.setvisibility(view.visible); } if(n==3){ i3.setvisibility(view.visible); } if(n==4){ i4.setvisibility(view.visible); } try { thread.currentthread().sleep(500); } catch (interruptedexception e) { // todo auto-generated catch block e.getstacktrace(); } } } } } the edited code:
public imageview i1; public imageview i2; public imageview i3; public imageview i4; public textview t; public textview s; random randomgenerator = new random(); @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); i1=new imageview(this); i1=(imageview) findviewbyid(r.id.imag1); i1.setvisibility(view.invisible); i2=new imageview(this); i2=(imageview) findviewbyid(r.id.imag2); i2.setvisibility(view.invisible); i3=new imageview(this); i3=(imageview) findviewbyid(r.id.imag3); i3.setvisibility(view.invisible); i4=new imageview(this); i4=(imageview) findviewbyid(r.id.imag4); i4.setvisibility(view.invisible); t=(textview)findviewbyid(r.id.time); s=(textview)findviewbyid(r.id.score); runonuithread(new runnable() //run on ui thread { int n; public void run(){ while(true){ n=randomgenerator.nextint(4)+1; if(n==1){ i1.setvisibility(view.visible); } if(n==2){ i2.setvisibility(view.visible); } if(n==3){ i3.setvisibility(view.visible); } if(n==4){ i4.setvisibility(view.visible); } } } }); } @override public boolean oncreateoptionsmenu(menu menu) { // inflate menu; adds items action bar if present. getmenuinflater().inflate(r.menu.main, menu); return true; }
android.view.viewrootimpl$calledfromwrongthreadexception: original thread created view hierarchy can touch views.
you must getting exception above. need update ui on ui thread. updating ui in thread. hence exception , crash.
inside thread use runonuithread update ui
runonuithread(new runnable() //run on ui thread { public void run() { while(true){ n=randomgenerator.nextint(8); if(n==1){ i1.setvisibility(view.visible); } .... } } }); also remove i1=new imageview(this); since initializing i1=(imageview) findviewbyid(r.id.imag1);
edit:
i recommend using handler purpose
int n; handler m_handler; runnable m_handlertask ; random r; declare above class variables;
inside activity oncrate() use handler below
r= new random(); m_handler= new handler(); m_handlertask = new runnable() { @override public void run() { n=r.nextint(4)+1; if(n==1){ i1.setvisibility(view.visible); i2.setvisibility(view.invisible); i3.setvisibility(view.invisible); i4.setvisibility(view.invisible); } if(n==2){ i2.setvisibility(view.visible); i1.setvisibility(view.invisible); i3.setvisibility(view.invisible); i4.setvisibility(view.invisible); } if(n==3){ i3.setvisibility(view.visible); i1.setvisibility(view.invisible); i2.setvisibility(view.invisible); i4.setvisibility(view.invisible); } if(n==4){ i4.setvisibility(view.visible); i1.setvisibility(view.invisible); i3.setvisibility(view.invisible); i2.setvisibility(view.invisible); } m_handler.postdelayed(m_handlertask, 50); // 50 milli seconds. set desired number } }; m_handlertask.run(); and remember stop handler when not required
m_handler.removecallbacks(m_handlertask);
Comments
Post a Comment