3

I'm using AsyncTask to pull data from my firebase and it works, however I'm using an empty while loop to ensure my database finishes it's operation before the Task moves on to the next step. I know in c using an empty while loop drives up CPU usage, and is generally really bad practice. However, when I try to do what I would do in c (call sleep or wait) the program crashes. Is there another way to do this for Android?

protected String doInBackground(String... params) { // add a local list of the restaurants found at yelp and a reference for the background thread to process. addRes(yelp.getRestaurants()); // loop through each restaurant and add all the menu items from each one. I think we need to randomize this list later on to provide variety in the app. for (int i = 0; i < restNames.size(); i++) { firebase = new firebaseHandler("Tastr Items/" + restNames.get(i) + "/Menu"); System.err.println("Adding Menu Item From ----> " + restNames.get(i)); firebase.readFromDatabase(); // Wait for firebase to finish adding new data, I would like to call sleep() here but it crashes the app for some reason. while (!firebase.isReaderDone()) { // Here his where I want to call sleep until firebase Handler is finished. try { wait(100); } catch (InterruptedException e) { e.printStackTrace(); } } // second loop to run through each menu item at each restaurant, this would be very inefficient for a huge number, but for now it should be fine if we have less than 100 or so menu items per restaurant. for (int j = 0; j < firebase.getReaderList().size(); j++) { System.err.println("Adding Menu Item ----> " + firebase.getReaderList().get(j)); addMenuItem(firebase.getReaderList().get(j)); firebase.changeReference("Tastr Items/" + restNames.get(i) + "/Menu/" + firebase.getReaderList().get(j) + "/Image Path"); } } return null; }//doInBackground 

Here are the errors

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2 Process: com.smileyface.tastr, PID: 5863 java.lang.RuntimeException: An error occurred while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:325) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) at java.util.concurrent.FutureTask.setException(FutureTask.java:223) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:761) Caused by: java.lang.IllegalMonitorStateException: object not locked by thread before wait() at java.lang.Object.wait(Native Method) at com.smileyface.tastr.Activities.TouchActivity$dataLoader.doInBackground(TouchActivity.java:369) at com.smileyface.tastr.Activities.TouchActivity$dataLoader.doInBackground(TouchActivity.java:346) at android.os.AsyncTask$2.call(AsyncTask.java:305) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)  at java.lang.Thread.run(Thread.java:761)  
7
  • 1
    can you post the stacktrace for the crash? Commented Nov 23, 2016 at 5:25
  • 1
    Check this out stackoverflow.com/questions/26590542/… Commented Nov 23, 2016 at 5:31
  • 1
    A quick search on stackoverflow stackoverflow.com/questions/1537116/… Commented Nov 23, 2016 at 5:34
  • 1
    You canot use thread in aysn task,So you can use runUi to solve the problem Commented Nov 23, 2016 at 5:35
  • 1
    Just a tip : the line start's with Caused by: in stacktrace is the real reason for your crash and searching that in google will fetch you answers pretty quickly. Commented Nov 23, 2016 at 5:39

1 Answer 1

2

use countdown timer

 CountDownTimer test= new CountDownTimer(3000,1000) { @Override public void onTick(long millisUntilFinished) { // do when countdown timer is started like show progressbar } @Override public void onFinish() { //write what ever you want to do after completing time like hiding progress bar } }; test.start(); 

here is 1000 is starting time and 3000 is ending time in ms

Sign up to request clarification or add additional context in comments.

2 Comments

Does that lower cpu usage? Could you explain why please? Thank you!
doinbackground method generally runs on seperate thread(background thread) that might be causing problem

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.