Android java runnable runTimeException

hyperfkcb

I was having some problem when trying to use the equivalent of setTimeout() which is Runnable Thread in Android Java. So basically I have an Array called pathGeometries which store the data returned from API:

 public void getDirection(Event eventModel, final Context context) {
    String eventX = eventModel.getEventX();
    String eventY = eventModel.getEventY();

    final ArrayList<Geometry> pathGeometries = new ArrayList<Geometry>();
    try {
        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(
                "http://www.onemap.sg/API/services.svc/route/solve?token=qo/s2TnSUmfLz+32CvLC4RMVkzEFYjxqyti1KhByvEacEdMWBpCuSSQ+IFRT84QjGPBCuz/cBom8PfSm3GjEsGc8PkdEEOEr&routeStops=29741.9,40039.6;"
                        + eventX + "," + eventY + "&routemode=CYCLE");
        HttpResponse response = client.execute(request);
        HttpEntity entity = response.getEntity();
        //Code to extract and store to pathGeometries 
        } catch (JSONException e) {
            e.printStackTrace();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    for (int iii = 0; iii < pathGeometries.size(); iii++) {
        final int counter = iii;
         final Handler h = new Handler();
            h.postDelayed(new Runnable()
            {
                private long time = 0;

                public void run()
                {
                    time += 1000;
                    Log.d("TimerExample", "Going for... " + time);
                    h.postDelayed(this, 1000);
                    moveNext(pathGeometries.get(counter).getX(),
                            pathGeometries.get(counter).getY(), 0, context);
                }
            }, 1000);     
    }   
}

And inside the for loop, I am looping each point in pathGeometries, set the point as center of the map by calling moveNext() and postDelayed it for 1 milliseconds before moving to the next record.

public static void moveNext(double coordx, double coordy, int k, Context context){
    Point p = new Point(coordx, coordy);
    EventMain.mMapView.zoomToResolution(p, 1);}

However, I am getting the error message as such:

01-17 16:30:41.547: E/AndroidRuntime(32490): FATAL EXCEPTION: AsyncTask #5
01-17 16:30:41.547: E/AndroidRuntime(32490): java.lang.RuntimeException: An error occured while executing doInBackground()
01-17 16:30:41.547: E/AndroidRuntime(32490):    at android.os.AsyncTask$3.done(AsyncTask.java:278)
01-17 16:30:41.547: E/AndroidRuntime(32490):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
01-17 16:30:41.547: E/AndroidRuntime(32490):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
01-17 16:30:41.547: E/AndroidRuntime(32490):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
01-17 16:30:41.547: E/AndroidRuntime(32490):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-17 16:30:41.547: E/AndroidRuntime(32490):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
01-17 16:30:41.547: E/AndroidRuntime(32490):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-17 16:30:41.547: E/AndroidRuntime(32490):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-17 16:30:41.547: E/AndroidRuntime(32490):    at java.lang.Thread.run(Thread.java:856)
01-17 16:30:41.547: E/AndroidRuntime(32490): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
01-17 16:30:41.547: E/AndroidRuntime(32490):    at android.os.Handler.<init>(Handler.java:121)
01-17 16:30:41.547: E/AndroidRuntime(32490):    at android.app.Activity.<init>(Activity.java:735)
01-17 16:30:41.547: E/AndroidRuntime(32490):    at nyp.edu.eneighbourhood.directionRunnable.<init>(directionRunnable.java:15)
01-17 16:30:41.547: E/AndroidRuntime(32490):    at Controller.EventController.getDirection(EventController.java:301)
01-17 16:30:41.547: E/AndroidRuntime(32490):    at AsyncTask.GetEventDirectionAsyncTask.doInBackground(GetEventDirectionAsyncTask.java:34)
01-17 16:30:41.547: E/AndroidRuntime(32490):    at AsyncTask.GetEventDirectionAsyncTask.doInBackground(GetEventDirectionAsyncTask.java:1)
01-17 16:30:41.547: E/AndroidRuntime(32490):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
01-17 16:30:41.547: E/AndroidRuntime(32490):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-17 16:30:41.547: E/AndroidRuntime(32490):    ... 5 more

Any ideas how to fix this? Because I not sure if I am doing it correctly. Thanks in advance.

EDIT In my UI Thread:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    final Handler handler = new Handler();
}

btnGetDirection.setOnClickListener(new OnClickListener() {
        String direction = "";
        int counter = 1;
        ArrayList<String> directionList = new ArrayList<String>();

        public void onClick(View v) {
                            eventModel.setEventX(String.valueOf(eventModel.getEventX()));
            eventModel.setEventY(String.valueOf(eventModel.getEventY()));
            new GetEventDirectionAsyncTask(
                    new GetEventDirectionAsyncTask.OnRoutineFinished() {
                        public void onFinish() {
                            // Hide the callout and plot user location
                            // marker
                                                // close the progress dialog
                            progressDialog.dismiss();
                        }
                    }, handler).execute(eventModel);
        }
    });

In the GetEventDirectionAsyncTask class:

public class GetEventDirectionAsyncTask extends AsyncTask<Event, Integer, Double> {
EventController eventCtrl = new EventController();
public static ArrayList<String> directionList = new ArrayList<String>();
Context context;
Handler handler;

public interface OnRoutineFinished { // interface
    void onFinish();
}

private OnRoutineFinished mCallbacks;

public GetEventDirectionAsyncTask(OnRoutineFinished callback, Handler handler) { // constructor with
                                                    // interface
    mCallbacks = callback;
    this.handler = handler;
}

public GetEventDirectionAsyncTask() {
} // empty constructor to maintain compatibility


@Override
protected Double doInBackground(Event... params) {
    if (params.length == 1) {
        eventCtrl.getDirection(params[0], context);
        directionList = eventCtrl.getDirectionPath(params[0], context);
    }
    return null;
}

protected void onPostExecute(Double result) {
    if (mCallbacks != null)
        mCallbacks.onFinish(); // call interface on finish
}

protected void onProgressUpdate(Integer... progress) {
}

}

In my Controller class getDirection method:

for (int iii = 0; iii < pathGeometries.size(); iii++) {
        final int counter = iii;
         final Handler h = new Handler();
            h.postDelayed(new Runnable()
            {
                private long time = 0;

                public void run()
                {
                    time += 1000;
                    Log.d("TimerExample", "Going for... " + time);
                    h.postDelayed(this, 1000);
                    moveNext(pathGeometries.get(counter).getX(),
                            pathGeometries.get(counter).getY(), 0, context);
                }
            }, 1000); 
ρяσѕρєя K

RuntimeException: Can't create handler inside thread that has not...

Because you are trying to call moveNext from doInBackground Thread instead of UI Thread

To fix following error:

First Option: Declare Handler h at class level in Activity and initialize it in onCreate method or in any method which run on UI thread like onPreExecute()

`Handler handle;
public GetEventDirectionAsyncTask(OnRoutineFinished callback,
                                  Handler handle){
  this.handle=handle;
  ...
 }`

pass hanlder from Activity as:

final Hanlder hanlder=new Hanlder();
btnGetDirection.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {

           GetEventDirectionAsyncTask obj= new GetEventDirectionAsyncTask(
                    new GetEventDirectionAsyncTask.OnRoutineFinished() {
                        public void onFinish() {
                           ...
                        }
                    },hanlder).execute(eventModel);
        }
    });

Now use handle to call postDelayed from doInBackground

Second Option: Use runOnUiThread to create and call handler from UI Thread:

  YourActivity.this.runOnUiThread(new Runnable() {
     @Override
     public void run() {
        create and call postDelayed method from Handler here
      }
  });

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Android java runnable runTimeException

From Dev

Android Java Runnable Will Not Stop

From Dev

Custom Fonts in Android: java.lang.RuntimeException

From Dev

Android [LocationManager] requestLocationUpdates(), java.lang.RuntimeException

From Dev

Android app java.lang.RuntimeException error

From Dev

Android PreferenceFragment : java.lang.RuntimeException

From Dev

java.lang.RuntimeException: Android Runtime error

From Dev

Android Boilepipe - java.lang.RuntimeException

From Dev

Android RuntimeException caused by java.lang.ClassNotFoundException

From Dev

Android JSON: java.lang.RuntimeException: Unable to start activity ComponentInfo

From Dev

Android "java.lang.RuntimeException: Parcelable encounteredClassNotFoundException reading a Serializable object"

From Dev

Android Media Recording: java.lang.RuntimeException: start failed

From Dev

android java lang runtimeexception fail to connect to camera service

From Dev

java.lang.RuntimeException: Unable to start activity ComponentInfo Android Manifest

From Dev

Android 4.4.2 - java.lang.RuntimeException: Performing stop of activity that is not resumed

From Dev

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo - Android

From Dev

java.lang.RuntimeException: Performing stop of activity that is not resumed in android

From Dev

Android java.lang.RuntimeException: Error receiving broadcast Intent

From Dev

Android+Robolectric Test ERROR "java.lang.RuntimeException: Stub!"

From Dev

RuntimeException: Unable to start activity ComponentInfo{}: java.lang.NullPointerException. Android

From Dev

Android 4.4.2 - java.lang.RuntimeException: Performing stop of activity that is not resumed

From Dev

Java.lang.RuntimeException: Unable to start activity ComponentInfo Error in Android

From Dev

java.lang.RuntimeException: Unable to start activity ComponentInfo in android

From Dev

java.lang.RuntimeException,Caused by: android.view.InflateException

From Dev

Android thread runnable performance

From Dev

Android - Check if Runnable is running

From Dev

Android handler and runnable nullpointer

From Dev

Android - wait for runnable to finish

From Dev

How to loop with runnable in Android

Related Related

  1. 1

    Android java runnable runTimeException

  2. 2

    Android Java Runnable Will Not Stop

  3. 3

    Custom Fonts in Android: java.lang.RuntimeException

  4. 4

    Android [LocationManager] requestLocationUpdates(), java.lang.RuntimeException

  5. 5

    Android app java.lang.RuntimeException error

  6. 6

    Android PreferenceFragment : java.lang.RuntimeException

  7. 7

    java.lang.RuntimeException: Android Runtime error

  8. 8

    Android Boilepipe - java.lang.RuntimeException

  9. 9

    Android RuntimeException caused by java.lang.ClassNotFoundException

  10. 10

    Android JSON: java.lang.RuntimeException: Unable to start activity ComponentInfo

  11. 11

    Android "java.lang.RuntimeException: Parcelable encounteredClassNotFoundException reading a Serializable object"

  12. 12

    Android Media Recording: java.lang.RuntimeException: start failed

  13. 13

    android java lang runtimeexception fail to connect to camera service

  14. 14

    java.lang.RuntimeException: Unable to start activity ComponentInfo Android Manifest

  15. 15

    Android 4.4.2 - java.lang.RuntimeException: Performing stop of activity that is not resumed

  16. 16

    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo - Android

  17. 17

    java.lang.RuntimeException: Performing stop of activity that is not resumed in android

  18. 18

    Android java.lang.RuntimeException: Error receiving broadcast Intent

  19. 19

    Android+Robolectric Test ERROR "java.lang.RuntimeException: Stub!"

  20. 20

    RuntimeException: Unable to start activity ComponentInfo{}: java.lang.NullPointerException. Android

  21. 21

    Android 4.4.2 - java.lang.RuntimeException: Performing stop of activity that is not resumed

  22. 22

    Java.lang.RuntimeException: Unable to start activity ComponentInfo Error in Android

  23. 23

    java.lang.RuntimeException: Unable to start activity ComponentInfo in android

  24. 24

    java.lang.RuntimeException,Caused by: android.view.InflateException

  25. 25

    Android thread runnable performance

  26. 26

    Android - Check if Runnable is running

  27. 27

    Android handler and runnable nullpointer

  28. 28

    Android - wait for runnable to finish

  29. 29

    How to loop with runnable in Android

HotTag

Archive