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

Popular posts from this blog

c# - Operator '==' incompatible with operand types 'Guid' and 'Guid' using DynamicExpression.ParseLambda<T, bool> -