title: Android AsyncTask doInBackground operation stopping suddenly with unhandled exception
body: <p>I am having a strange problem.My <strong>asyncTask operation</strong> is getting terminated suddenly with an unhandled exception.<strong>about 45 % of the tasks is getting completed then the termination occurs.</strong></p>
  
  <p>here is my logcat</p>
  
  <pre><code>01-26 12:13:48.216: I/System.out(4421): success
  01-26 12:13:48.386: I/System.out(4421): success
  01-26 12:13:48.576: I/System.out(4421): success
  01-26 12:13:48.616: D/dalvikvm(4421): GC_CONCURRENT freed 473K, 48% free 3256K/6215K, external 0K/0K, paused 3ms+4ms
  01-26 12:13:48.806: I/System.out(4421): success
  01-26 12:13:48.806: W/dalvikvm(4421): threadid=9: thread exiting with uncaught exception (group=0x40018560)
  01-26 12:13:48.806: E/AndroidRuntime(4421): FATAL EXCEPTION: AsyncTask #1
  01-26 12:13:48.806: E/AndroidRuntime(4421): java.lang.RuntimeException: An error occured while executing doInBackground()
  01-26 12:13:48.806: E/AndroidRuntime(4421):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
  01-26 12:13:48.806: E/AndroidRuntime(4421):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
  01-26 12:13:48.806: E/AndroidRuntime(4421):     at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
  01-26 12:13:48.806: E/AndroidRuntime(4421):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
  01-26 12:13:48.806: E/AndroidRuntime(4421):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
  01-26 12:13:48.806: E/AndroidRuntime(4421):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
  01-26 12:13:48.806: E/AndroidRuntime(4421):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
  01-26 12:13:48.806: E/AndroidRuntime(4421):     at java.lang.Thread.run(Thread.java:1019)
  01-26 12:13:48.806: E/AndroidRuntime(4421): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
  01-26 12:13:48.806: E/AndroidRuntime(4421):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
  01-26 12:13:48.806: E/AndroidRuntime(4421):     at java.util.ArrayList.get(ArrayList.java:311)
  01-26 12:13:48.806: E/AndroidRuntime(4421):     at android.gesture.Instance.temporalSampler(Instance.java:91)
  01-26 12:13:48.806: E/AndroidRuntime(4421):     at android.gesture.Instance.createInstance(Instance.java:76)
  01-26 12:13:48.806: E/AndroidRuntime(4421):     at android.gesture.GestureStore.addGesture(GestureStore.java:158)
  01-26 12:13:48.806: E/AndroidRuntime(4421):     at android.gesture.GestureLibrary.addGesture(GestureLibrary.java:68)
  01-26 12:13:48.806: E/AndroidRuntime(4421):     at com.android.pack.TestActivity.saveGesture(TestActivity.java:467)
  01-26 12:13:48.806: E/AndroidRuntime(4421):     at com.android.pack.TestActivity$A.doInBackground(TestActivity.java:102)
  01-26 12:13:48.806: E/AndroidRuntime(4421):     at com.android.pack.TestActivity$A.doInBackground(TestActivity.java:1)
  01-26 12:13:48.806: E/AndroidRuntime(4421):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
  01-26 12:13:48.806: E/AndroidRuntime(4421):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
  01-26 12:13:48.806: E/AndroidRuntime(4421):     ... 4 more
  01-26 12:13:49.356: E/WindowManager(4421): Activity com.android.pack.TestActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4053a358 that was originally added here
  01-26 12:13:49.356: E/WindowManager(4421): android.view.WindowLeaked: Activity com.android.pack.TestActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4053a358 that was originally added here
  01-26 12:13:49.356: E/WindowManager(4421):  at android.view.ViewRoot.&lt;init&gt;(ViewRoot.java:259)
  01-26 12:13:49.356: E/WindowManager(4421):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
  01-26 12:13:49.356: E/WindowManager(4421):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
  01-26 12:13:49.356: E/WindowManager(4421):  at android.view.Window$LocalWindowManager.addView(Window.java:465)
  01-26 12:13:49.356: E/WindowManager(4421):  at android.app.Dialog.show(Dialog.java:241)
  01-26 12:13:49.356: E/WindowManager(4421):  at com.android.pack.TestActivity.addgestures(TestActivity.java:159)
  01-26 12:13:49.356: E/WindowManager(4421):  at com.android.pack.TestActivity.onOptionsItemSelected(TestActivity.java:404)
  01-26 12:13:49.356: E/WindowManager(4421):  at android.app.Activity.onMenuItemSelected(Activity.java:2205)
  01-26 12:13:49.356: E/WindowManager(4421):  at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:776)
  01-26 12:13:49.356: E/WindowManager(4421):  at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:143)
  01-26 12:13:49.356: E/WindowManager(4421):  at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855)
  01-26 12:13:49.356: E/WindowManager(4421):  at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:532)
  01-26 12:13:49.356: E/WindowManager(4421):  at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122)
  01-26 12:13:49.356: E/WindowManager(4421):  at android.view.View$PerformClick.run(View.java:9107)
  01-26 12:13:49.356: E/WindowManager(4421):  at android.os.Handler.handleCallback(Handler.java:587)
  01-26 12:13:49.356: E/WindowManager(4421):  at android.os.Handler.dispatchMessage(Handler.java:92)
  01-26 12:13:49.356: E/WindowManager(4421):  at android.os.Looper.loop(Looper.java:130)
  01-26 12:13:49.356: E/WindowManager(4421):  at android.app.ActivityThread.main(ActivityThread.java:3835)
  01-26 12:13:49.356: E/WindowManager(4421):  at java.lang.reflect.Method.invokeNative(Native Method)
  01-26 12:13:49.356: E/WindowManager(4421):  at java.lang.reflect.Method.invoke(Method.java:507)
  01-26 12:13:49.356: E/WindowManager(4421):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
  01-26 12:13:49.356: E/WindowManager(4421):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
  01-26 12:13:49.356: E/WindowManager(4421):  at dalvik.system.NativeStart.main(Native Method)
  01-26 12:14:04.836: I/Process(4421): Sending signal. PID: 4421 SIG: 9
  </code></pre>
  
  <p><strong>and here is the AsyncTask class</strong></p>
  
  <pre><code>class A extends AsyncTask&lt;File[],Integer,Void&gt;
          {
              private Context cnt;
                  int count=0;
              @Override
              protected void onPreExecute() {
  
              }
              A(Context context)
              {
                  cnt=context;
              }
  
              protected Void doInBackground(File[]... params) {
                  // TODO Auto-generated method stub
                  File[] newfiles=params[0];
                  File[] temp=null;
                  int progress=0;
                  float dircnt=0;
                  int numberofdir=newfiles.length;
                  for(File b:newfiles)
                  {
  
  
                      count=0;
                      dirname=b.getName();
                      if(b.isDirectory())
                      {
  
                          temp=b.listFiles();
                      }
                      for(File a:temp)
                      {
                          gest=dotask.batchprocess(a.getPath());
                          if(gest!=null)
                              System.out.println("success");
                          String name=dirname+"_"+count;
                          saveGesture(name, gest);
                          count++;
  
                      }
                      dircnt=dircnt+1;
                       progress=(int)((dircnt/numberofdir)*100);
                       try {
                          Thread.sleep(60);
                          publishProgress(progress);
                      } catch (InterruptedException e) {
                          // TODO Auto-generated catch block
                          e.printStackTrace();
                      }
  
  
  
                  }
  
  
                  return null;
              }
              @Override
              protected void onProgressUpdate(Integer... values) {
                  // increment progress bar by progress value
                  pd.setProgress(values[0]);
                  pd.setMessage("completed "+dirname);
  
  
          }
               protected void onPostExecute() {
                  pd.hide();
                  pd=null;
               }
  </code></pre>
  
  <p>}</p>
  
  <p>and here is the method that calls the Asynctask object and executes it</p>
  
  <pre><code>public void addgestures()
          {
              cView.postInvalidate();
              dotask.setH(cView.getH());
              dotask.setW(cView.getW());
  
              count=0;
              files=null;
              /*if(dir.isDirectory()) 
              {
                  files=dir.listFiles();
              }*/
              files=dir.listFiles();
              for(int i=0;i&lt;files.length;i++)
              {
                  System.out.println(files[i].getPath());
              }
               pd = new ProgressDialog(this);
                  pd.setMessage("Matching progress");
                  pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                  pd.setMax(100);
                  pd.setCancelable(false);
                  pd.setProgress(0);
                  pd.show(); 
  
  
  
              A a=new A(this);
              a.execute(files);
  
  
  
          }
  </code></pre>
  
  <p>There is no error in the rest of the program as about 40% of the task is being done successfully..So I din't upload the rest of the program.</p>
  
  <pre><code>**here is the TESTACTIVITY CLASS**
  
  package com.android.pack;
  
  
  import java.io.File;
  import java.net.URISyntaxException;
  
  
  
  import android.app.Activity;
  import android.app.AlertDialog;
  import android.app.ProgressDialog;
  import android.content.Context;
  import android.content.DialogInterface;
  import android.content.Intent;
  import android.gesture.Gesture;
  import android.gesture.GestureLibraries;
  import android.gesture.GestureLibrary;
  import android.net.Uri;
  import android.os.AsyncTask;
  import android.os.Bundle;
  import android.os.Environment;
  import android.os.Handler;
  import android.os.Message;
  import android.text.Editable;
  import android.util.Log;
  import android.view.Menu;
  import android.view.MenuItem;
  import android.widget.EditText;
  import android.widget.LinearLayout;
  import android.widget.Toast;
  
  
  public class TestActivity extends Activity {
      /** Called when the activity is first created. */
       int height;
       int weight;
       private ProgressDialog pd=null;
       customview cView;
       String path="";
       String pathchk="";
       String temp="";
       String name=null;
       float pathSmooth[];
       private  File mStoreFile;
       Gesture gest;
       File dir;
       String dirname;
       File[] files;
       int count;
       int Height;
       int Weight;
       task dotask;
       Context ct;
       private static GestureLibrary sStore=null;
  
  
       private static final int FILE_SELECT_CODE = 0;
  
  
          public void perform() //
          {
              cView.set_file(pathchk);
              cView.postInvalidate();
          }
          class A extends AsyncTask&lt;File[],Integer,Void&gt;
          {
              private Context cnt;
                  int count=0;
              @Override
              protected void onPreExecute() {
  
              }
              A(Context context)
              {
                  cnt=context;
              }
  
              protected Void doInBackground(File[]... params) {
                  // TODO Auto-generated method stub
                  File[] newfiles=params[0];
                  File[] temp=null;
                  int progress=0;
                  float dircnt=0;
                  int numberofdir=newfiles.length;
                  for(File b:newfiles)
                  {
  
  
                      count=0;
                      dirname=b.getName();
                      if(b.isDirectory())
                      {
  
                          temp=b.listFiles();
                      }
                      for(File a:temp)
                      {
                          gest=dotask.batchprocess(a.getPath());
                          if(gest!=null)
                              System.out.println("success");
                          String name=dirname+"_"+count;
                          saveGesture(name, gest);
                          count++;
  
                      }
                      dircnt=dircnt+1;
                       progress=(int)((dircnt/numberofdir)*100);
                       try {
                          Thread.sleep(60);
                          publishProgress(progress);
                      } catch (InterruptedException e) {
                          // TODO Auto-generated catch block
                          e.printStackTrace();
                      }
  
  
  
                  }
  
  
                  return null;
              }
              @Override
              protected void onProgressUpdate(Integer... values) {
                  // increment progress bar by progress value
                  pd.setProgress(values[0]);
                  pd.setMessage("completed "+dirname);
  
  
          }
               protected void onPostExecute() {
                  pd.hide();
                  pd=null;
               }
          }
          public void addgestures()
          {
              cView.postInvalidate();
              dotask.setH(cView.getH());
              dotask.setW(cView.getW());
  
              count=0;
              files=null;
              /*if(dir.isDirectory()) 
              {
                  files=dir.listFiles();
              }*/
              files=dir.listFiles();
              for(int i=0;i&lt;files.length;i++)
              {
                  System.out.println(files[i].getPath());
              }
               pd = new ProgressDialog(this);
                  pd.setMessage("Matching progress");
                  pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                  pd.setMax(100);
                  pd.setCancelable(false);
                  pd.setProgress(0);
                  pd.show(); 
  
  
  
              A a=new A(this);
              a.execute(files);
  
  
  
          }
  
  
  
  
  
           public void showFileChooser() {
              Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
             // File file = new File("/sdcard");
              intent.setType("file://*"); 
  
              intent.addCategory(Intent.CATEGORY_OPENABLE);
  
              try {
                  startActivityForResult(
                          Intent.createChooser(intent, "Select a File to Upload"),
                          FILE_SELECT_CODE);
  
              } catch (android.content.ActivityNotFoundException ex) {
                  // Potentially direct the user to the Market with a Dialog
                  Toast.makeText(this, "Please install a File Manager.", 
                          Toast.LENGTH_SHORT).show();
              }
          }
              public void smoothPoint()
              {
  
                  float pathScale[]=cView.getPathSmooth();
                  int pi;             // Index over all the points in the trace
  
                  int ti;             // Index over all the traces of a tracegroup
                  float Xavg,Yavg;
                  //int numTraces=getNumTraces();
                  int numTraces=1;
                  int stopCount=0;
                  int numPoints =(pathScale.length)/2;
                  float xsd,ysd;
                  int count1=1,count2=1;
                  float m2=0,m1=0;
                  float sumX=0, sumY=0;          //partial sum
                  float Xchannel []=new float[numPoints*2];
                  float Xdist=0,Ydist=0;
                  float Ychannel []=new float[numPoints*2];
                  float nXchannel[]= new float[numPoints*2*2];
                  float nYchannel[]=new float[numPoints*2*2];
                  int finalCount=1;
                  float n1Xchannel[]= new float[numPoints*4*2];
                  float n1Ychannel[]=new float[numPoints*4*2];
                  float xfinal[] = new float[numPoints*4*2];
                  float yfinal[]= new float[numPoints*4*2];
                  int valid[]=new int[numPoints];
                  Log.v("number of points",numPoints+"");
                  for(int i=0;i&lt;numPoints;i++)
                  {
                      //valid[i]=1;
                      Xchannel[i]=pathScale[i*2];
                      Ychannel[i]=pathScale[i*2+1];
                  }
                  for(ti=0;ti&lt;numTraces;ti++)
                  {
                      sumX=sumY=0;
                      for(pi=0;pi&lt;numPoints-1;pi++)
                      {
                          sumX+=Math.abs((Math.abs(Xchannel[pi+1])-Math.abs(Xchannel[pi])));
                          sumY+=Math.abs((Math.abs(Ychannel[pi+1])-Math.abs(Ychannel[pi])));
                      }
                  }
                  for(pi=1;pi&lt;numPoints-1;pi++)
                  {
                      m1=(Ychannel[pi]-Ychannel[pi-1])/(Xchannel[pi]-Xchannel[pi-1]);
                      m2=(Ychannel[pi+1]-Ychannel[pi])/(Xchannel[pi+1]-Xchannel[pi]); 
                      if(m1*m2&lt;0)
                      {
                          valid[pi]=0;
                          stopCount++;
  
                      }
  
                  }
  
  
                  nXchannel[0]=Xchannel[0];
                  nYchannel[0]=Ychannel[0];
                  for(pi=1;pi&lt;numPoints;pi++)
                  {
                      nXchannel[pi*2-1]=(Xchannel[pi]+Xchannel[pi-1])/2;
  
                      nYchannel[pi*2-1]=(Ychannel[pi]+Ychannel[pi-1])/2;
                      //System.out.print(" \n mid x and y "+nXchannel[pi*2-1]+nYchannel[pi*2-1]);
                      nXchannel[pi*2]=Xchannel[pi];
  
                      nYchannel[pi*2]=Ychannel[pi];
                      count1+=2;
                  }
                  //System.out.println("new array... ");
                  n1Xchannel[0]=nXchannel[0];
                  n1Ychannel[0]=nYchannel[0];
                  for(pi=1;pi&lt;count1;pi++)
                  {
                      n1Xchannel[pi*2-1]=(nXchannel[pi]+nXchannel[pi-1])/2;
  
                      n1Ychannel[pi*2-1]=(nYchannel[pi]+nYchannel[pi-1])/2;
                      //System.out.print(" \n mid x and y "+n1Xchannel[pi*2-1]+n1Ychannel[pi*2-1]);
                      n1Xchannel[pi*2]=nXchannel[pi];
                      count2+=2;
                      n1Ychannel[pi*2]=nYchannel[pi];
  
                  }
                  Log.v("Count1",count1+"");
                  Log.v("Count2",count2+"");
                  xfinal[0]=n1Xchannel[0];
                  yfinal[0]=n1Ychannel[0];
                  Xavg=sumX/(numPoints -1);
                  Log.v("finalCount",finalCount+"");
                  Log.v("Xavg",sumX+"");
                  Yavg=sumY/(numPoints-1) ;
  
                  for(pi=1;pi&lt;count2-1;pi++)
                  {
  
                      Xdist=Math.abs((Math.abs(n1Xchannel[pi])-Math.abs(xfinal[finalCount-1])));
                      Ydist=Math.abs((Math.abs(n1Ychannel[pi])-Math.abs(yfinal[finalCount-1])));
                          if(Xdist&gt;=Xavg||Ydist&gt;=Yavg)
                          {
                              xfinal[finalCount]=n1Xchannel[pi];
                              yfinal[finalCount++]=n1Ychannel[pi];
                      }
  
  
                  }
                  pathSmooth=new float[finalCount*2];
                  for(pi=0;pi&lt;finalCount;pi++)
                  {
                          pathSmooth[pi*2] = xfinal[pi];
                          pathSmooth[pi*2+1] = yfinal[pi];
                      //pnts.get(pi).x=(int) nXchannel[pi];
                      //pnts.get(pi).y=(int) nYchannel[pi];
                      ////System.out.println("x "+(int)nXchannel[pi]+ " and y "+(int)nYchannel[pi]);
                  }   
  
                  cView.setPathSmooth(pathSmooth);
  
  
  
  
  
          }
       protected void onActivityResult(int requestCode, int resultCode, Intent data)
       {
              switch (requestCode) {
                  case  FILE_SELECT_CODE:   
                  if (resultCode == RESULT_OK) {  
                      // Get the Uri of the selected file 
                      Uri uri = data.getData();
                      Log.v("check", "File Uri: " + uri.toString());
                      // Get the path
  
                      try {
                          path = FileUtils.getPath(this, uri);
                          pathchk=path.substring(12);
                          perform();
  
  
  
                      } catch (URISyntaxException e) {
                          // TODO Auto-generated catch block
                          Log.v("error", "File Path: "+pathchk);
                      }
                      Log.v("check", "File Path: "+path);
                      // Get the file instance
                      // File file = new File(path);
                      // Initiate the upload
                  }           
                  break;  
                  case 1:
                      if(resultCode==RESULT_OK)
                      {
                              Uri uri=data.getData();
                              dir=new File(uri.getPath());
                              dirname=dir.getName();
                              //addgestures();
  
                      }
                      break;
              }
  
          super.onActivityResult(requestCode, resultCode, data);
          }
      @Override
  
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main); 
          cView = (customview)findViewById(R.id.customview1);        
          LinearLayout ll = new LinearLayout(this);
          ll.setOrientation(LinearLayout.VERTICAL);
          mStoreFile= new File(Environment.getExternalStorageDirectory(), "gestures");
          if (sStore == null) {
              sStore = GestureLibraries.fromFile(mStoreFile);
          }
          dotask=new task();
  
          //select=(Button)findViewById(R.id.button1);      
      }
      public boolean onCreateOptionsMenu(Menu menu)
      {
      //call the base class to include system menus
          super.onCreateOptionsMenu(menu);
          menu.add(0,1,0,"Open File"); // title
          menu.add(0,2,1,"Smoothen");
          menu.add(0,3,2,"add to gesture library");
          menu.add(0,4,3,"Assign a name");
          menu.add(0,5,4,"select a folder");
          menu.add(0,6,5,"Exit");
      //It is important to return true to see the menu
      return true;
      }
      public boolean onOptionsItemSelected(MenuItem item) {
  
          // Handle item selection
          switch (item.getItemId()) {
          case 1:
              showFileChooser();
              return true;
          case 2:
              smoothPoint();
              return true;
          case 3:
  
              /*if(name.length()&lt;1)
                  Toast.makeText(getApplicationContext(), "Give a name to the gesture ist", Toast.LENGTH_LONG).show();
              else
              {
                  gest=cView.batchprocess(pathchk);
                  saveGesture(name, gest);
              }*/
              addgestures();
               return true;
  
          case 4:
              nameDialog();
              return true;
          case 5:
              Intent intent = new Intent("org.openintents.action.PICK_DIRECTORY");
              intent.setData(Uri.parse("file:///sdcard"));
              intent.putExtra("org.openintents.extra.TITLE", "Please select a folder");
              intent.putExtra("org.openintents.extra.BUTTON_TEXT", "Use this folder");
              startActivityForResult(intent, 1);
              return true;
          case 6:
              Toast.makeText(getApplicationContext(), "exiting", Toast.LENGTH_LONG).show();
              System.exit(1);
              return true;
          default:
              return super.onOptionsItemSelected(item);
          }
      }
      public void nameDialog()
      {
          AlertDialog.Builder alert = new AlertDialog.Builder(this);
  
          alert.setTitle("Title");
          alert.setMessage("Message");
  
          // Set an EditText view to get user input 
          final EditText input = new EditText(this);
          alert.setView(input);
  
          alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int whichButton) {
           name = input.getText().toString();
           //Log.d("name",name);
           check();
            // Do something with value!
            }
          });
  
          alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
              // Canceled.
            }
          });
  
          alert.show();
      }
      public static GestureLibrary get()
      {
          return sStore;
      }
      public void check()
      {
          if(name.length()&lt;1)
              Toast.makeText(this,"No name is set for this gesture",Toast.LENGTH_SHORT).show();
          else
              Toast.makeText(this,"GESTURE NAME IS "+name,Toast.LENGTH_SHORT).show();
      }
      public void saveGesture(String name,Gesture gest)
      {
          final GestureLibrary store = get();
          store.addGesture(name, gest);
          store.save();
  
      }
  
  }
  </code></pre>