Android can't create handler inside thread that has not called looper.prepare()

13,187

Your error is basically saying that you're trying to do something in a non UIThread. To run it in the UI Thread, just use this:

runOnUiThread(new Runnable() {
    public void run() {
        // do your work right here
    }
});
Share:
13,187
user1331120
Author by

user1331120

Updated on June 04, 2022

Comments

  • user1331120
    user1331120 almost 2 years

    I started developing an Android application that record a video and I need to gather the GPS location every 1 minute

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        // Create an instance of Camera
        mCamera = getCameraInstance();
    
        // Create our Preview view and set it as the content of our activity.
        mPreview = new CameraPreview(this, mCamera);
        FrameLayout preview = (FrameLayout) findViewById(id.camera_preview);
        preview.addView(mPreview);
    
        private boolean isRecording = false;
    
        // Add a listener to the Capture button
        Button captureButton = (Button) findViewById(id.button_capture);
        captureButton.setOnClickListener(
          new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            if (isRecording) {
                // stop recording and release camera
                mMediaRecorder.stop();  // stop the recording
                releaseMediaRecorder(); // release the MediaRecorder object
                mCamera.lock();         // take camera access back from MediaRecorder
    
                // inform the user that recording has stopped
                setCaptureButtonText("Capture");
                isRecording = false;
            } else {
                // initialize video camera
                if (prepareVideoRecorder()) {
                    // Camera is available and unlocked, MediaRecorder is prepared,
                    // now you can start recording
                    mMediaRecorder.start();
    
                    // get the gps data
                    GpsDataFile.getOutPutDataFile(DATA_TYPE_GPS);
                    mTimer = new Timer;
                    mTimer.schedule(new setGpsDataToFile(),0,1000)
                    // inform the user that recording has started
                    setCaptureButtonText("Stop");
                    isRecording = true;
                } else {
                    // prepare didn't work, release the camera
                    releaseMediaRecorder();
                    // inform user
                }
            }
        }
     }
    
    
    
    Private Class setGpsDataToFile extends TimerTask {
      @Override
      public void run {
       // getLocation contains another timer task
       myLocation.getLocation(getApplicationContext(), mLocationResult); // I got the error here
       // write the gps data in a file
       gpsDataCapture(GpsDataFile, mLatitude, mLongitude);
      }
    }
    

    I got the error FATAL EXCEPTION: Timer-1: can't create handler inside thread that has not called looper.prepare() and I think the problem is that I create a handler inside an other. So is there an other way to get the same result?