title: How to wait for an activity to finish in asynctask
body: <p>I know that the purpose of the AsyncTask is to run asynchronously with other tasks of the app and finish in the background, but apparently I need to do this, I need to start an activity from AsyncTask and since I cant extend an activity in this class I can not use startactivityforresult, so how can I wait till my activity finishes?</p>
  
  <p>Here is my code:</p>
  
  <pre><code> public class ListSpdFiles extends AsyncTask&lt;Void, Void, String[]&gt; {
  public AsyncResponse delegate = null;
  private static final String TAG = "ListSpdFiles: ";
  Context applicationContext;
  ContentResolver spdappliationcontext;
  public final CountDownLatch setSignal= new CountDownLatch(1);
  private final ReentrantLock lock = new ReentrantLock();
  
  String username = "";
  
  /**
   * Status code returned by the SPD on operation success.
   */
  private static final int SUCCESS = 4;
  
  private boolean createbutt;
  private boolean deletebutt;
  private String initiator;
  private String path;
  private String pass;
  private String url;
  private SecureApp pcas;
  private boolean isConnected = false;  // connected to PCAS service?
  private String CurrentURL = null;
  
  private PcasConnection pcasConnection = new PcasConnection() {
  
      @Override
      public void onPcasServiceConnected() {
          Log.d(TAG, "pcasServiceConnected");
          latch.countDown();
      }
  
      @Override
      public void onPcasServiceDisconnected() {
          Log.d(TAG, "pcasServiceDisconnected");
      }
  };
  private CountDownLatch latch = new CountDownLatch(1);
  
  
  public ListSpdFiles(boolean createbutt, boolean deletebutt, String url, String pass, Context context, String initiator, String path, AsyncResponse asyncResponse) {
      this.initiator = initiator;
      this.path = path;
      this.pass= pass;
      this.url= url;
      this.createbutt= createbutt;
      this.deletebutt=deletebutt;
      applicationContext = context.getApplicationContext();
      spdappliationcontext = context.getContentResolver();
  
      delegate = asyncResponse;
  
  }
  
  private void init() {
      Log.d(TAG, "starting task");
      pcas = new AndroidNode(applicationContext, pcasConnection);
      isConnected = pcas.connect();
  }
  
  private void term() {
      Log.d(TAG, "terminating task");
      if (pcas != null) {
          pcas.disconnect();
          pcas = null;
          isConnected = false;
      }
  }
  
  @Override
  protected void onPreExecute() {
      super.onPreExecute();
      init();
  }
  
  @Override
  protected String[] doInBackground(Void... params) {
  
      CurrentURL = getLastAccessedBrowserPage();
      // check if connected to PCAS Service
      if (!isConnected) {
          Log.v(TAG, "not connected, terminating task");
          return null;
      }
  
      // wait until connection with SPD is up
      try {
          if (!latch.await(20, TimeUnit.SECONDS)) {
              Log.v(TAG, "unable to connected within allotted time, terminating task");
              return null;
          }
      } catch (InterruptedException e) {
          Log.v(TAG, "interrupted while waiting for connection in lsdir task");
          return null;
      }
  
      // perform operation (this is where the actual operation is called)
      try {
          return lsdir();
      } catch (DeadServiceException e) {
          Log.i(TAG, "service boom", e);
          return null;
      } catch (DeadDeviceException e) {
          Log.i(TAG, "device boom", e);
          return null;
      }
  }
  
  @Override
  protected void onPostExecute(String[] listOfFiles) {
      super.onPostExecute(listOfFiles);
      if (listOfFiles == null) {
          Log.i(TAG, "task concluded with null list of files");
      } else {
          Log.i(TAG, "task concluded with the following list of files: "
                  + Arrays.toString(listOfFiles));
      }
      term();
      delegate.processFinish(username);
  }
  
  @Override
  protected void onCancelled(String[] listOfFiles) {
      super.onCancelled(listOfFiles);
      Log.i(TAG, "lsdir was canceled");
      term();
  }
  
  /**
   * Returns an array of strings containing the files available at the given path, or
   * {@code null} on failure.
   */
  private String[] lsdir() throws DeadDeviceException, DeadServiceException {
      Result&lt;List&lt;String&gt;&gt; result = pcas.lsdir(initiator, path);  // the lsdir call to the
      boolean crtbut = createbutt;
      boolean dlbut= deletebutt;
      ArrayList&lt;String&gt; mylist = new ArrayList&lt;String&gt;();
      final Global globalVariable = (Global) applicationContext;
      if (crtbut==false &amp;&amp; dlbut == false){
           if (  globalVariable.getPasswordButt()==false ) {
  
               final boolean isusername  = globalVariable.getIsUsername();
  
               if (isusername == true) {
  
                   Log.i(TAG, "current url: " + CurrentURL);
  
                   if (Arrays.toString(result.getValue().toArray(new String[0])).contains(CurrentURL)) {
                       String sharareh = Arrays.toString(result.getValue().toArray(new String[0]));
                       String[] items = sharareh.split(", ");
                       for (String item : items) {
                           String trimmed;
                           if (item.startsWith("[" + CurrentURL + ".")) {
                               trimmed = item.replace("[" + CurrentURL + ".", "");
                               if (trimmed.endsWith(".txt]")) {
                                   trimmed = trimmed.replace(".txt]", "");
                                   mylist.add(trimmed.replace(".txt]", ""));
                               } else if (trimmed.endsWith(".txt")) {
                                   trimmed = trimmed.replace(".txt", "");
                                   mylist.add(trimmed.replace(".txt", ""));
                               }
                               Log.i(TAG, "list of files sharareh: " + trimmed);
                           } else if (item.startsWith(CurrentURL + ".")) {
  
                               trimmed = item.replace(CurrentURL + ".", "");
                               if (trimmed.endsWith(".txt]")) {
                                   trimmed = trimmed.replace(".txt]", "");
                                   mylist.add(trimmed.replace(".txt]", ""));
                               } else if (trimmed.endsWith(".txt")) {
                                   trimmed = trimmed.replace(".txt", "");
                                   mylist.add(trimmed.replace(".txt", ""));
                               }
                               Log.i(TAG, "list of files sharareh: " + trimmed);
  
                           }
  
                       }
                   }
  
  
                   globalVariable.setPopupdone(false);
  
                   Intent i = new Intent(applicationContext, PopUp.class);
                   i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                   i.putExtra("EXTRA_SESSION_ID", mylist);
                   applicationContext.startActivity(i);
                   username = globalVariable.getUsername();
  
               }
  
               else if (isusername == false)
                   Log.i(TAG, "Wrong Input Type For Username.");
           }
           if (result.getState() != SUCCESS) {
               Log.v(TAG, "operation failed");
               return null;
           }
           if (result.getValue() == null) {
               Log.v(TAG, "operation succeeded but operation returned null list");
               return null;
           }
  
           return result.getValue().toArray(new String[0]);
       }
  
      //}
      if (result.getState() != SUCCESS) {
          Log.v(TAG, "operation failed");
          return null;
      }
      if (result.getValue() == null) {
          Log.v(TAG, "operation succeeded but operation returned null list");
          return null;
      }
  
      return result.getValue().toArray(new String[0]);
  }
  
  public String getLastAccessedBrowserPage() {
      String Domain = null;
  
      Cursor webLinksCursor = spdappliationcontext.query(Browser.BOOKMARKS_URI, Browser.HISTORY_PROJECTION, null, null, Browser.BookmarkColumns.DATE + " DESC");
      int row_count = webLinksCursor.getCount();
  
      int title_column_index = webLinksCursor.getColumnIndexOrThrow(Browser.BookmarkColumns.TITLE);
      int url_column_index = webLinksCursor.getColumnIndexOrThrow(Browser.BookmarkColumns.URL);
  
      if ((title_column_index &gt; -1) &amp;&amp; (url_column_index &gt; -1) &amp;&amp; (row_count &gt; 0)) {
          webLinksCursor.moveToFirst();
          while (webLinksCursor.isAfterLast() == false) {
              if (webLinksCursor.getInt(Browser.HISTORY_PROJECTION_BOOKMARK_INDEX) != 1) {
                  if (!webLinksCursor.isNull(url_column_index)) {
                      Log.i("History", "Last page browsed " + webLinksCursor.getString(url_column_index));
                      try {
                          Domain = getDomainName(webLinksCursor.getString(url_column_index));
                          Log.i("Domain", "Last page browsed " + Domain);
                          return Domain;
  
                      } catch (URISyntaxException e) {
                          e.printStackTrace();
                      }
                      break;
                  }
              }
              webLinksCursor.moveToNext();
          }
      }
      webLinksCursor.close();
      return null;
  
  }
  
  public String getDomainName(String url) throws URISyntaxException {
      URI uri = new URI(url);
      String domain = uri.getHost();
      return domain.startsWith("www.") ? domain.substring(4) : domain;
  }}
  </code></pre>
  
  <p>My Activity class:</p>
  
  <pre><code>public class PopUp  extends Activity  {
  
  private static final String TAG = "PopUp";
  ArrayList&lt;String&gt; value = null;
  
  ArrayList&lt;String&gt; usernames;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
  
      final Global globalVariable = (Global) getApplicationContext();
      globalVariable.setUsername("");
      Bundle extras = getIntent().getExtras();
      if (extras != null) {
          value = extras.getStringArrayList("EXTRA_SESSION_ID");
      }
  
      usernames = value;
  
      super.onCreate(savedInstanceState);
      setContentView(R.layout.popupactivity);
  
      final Button btnOpenPopup = (Button) findViewById(R.id.openpopup);
      btnOpenPopup.setOnClickListener(new Button.OnClickListener() {
  
          @Override
          public void onClick(View arg0) {
              LayoutInflater layoutInflater = (LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
              View popupView = layoutInflater.inflate(R.layout.popup, null);
              final PopupWindow popupWindow = new PopupWindow(popupView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
              Button btnSelect = (Button) popupView.findViewById(R.id.select);
              Spinner popupSpinner = (Spinner) popupView.findViewById(R.id.popupspinner);
              ArrayAdapter&lt;String&gt; adapter = new ArrayAdapter&lt;String&gt;(PopUp.this, android.R.layout.simple_spinner_item, usernames);
              adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
              popupSpinner.setAdapter(adapter);
              popupSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                  @Override
                  public void onItemSelected(AdapterView&lt;?&gt; arg0, View arg1, int arg2, long arg3) {
  
                      globalVariable.setUsername(usernames.get(arg2));
  
  
  
                  }
  
                  @Override
                  public void onNothingSelected(AdapterView&lt;?&gt; arg0) {
                  }
              });
              btnSelect.setOnClickListener(new Button.OnClickListener() {
  
                                               @Override
                                               public void onClick(View v) {
                                                   globalVariable.setPopupdone(true);
                                                   popupWindow.dismiss();
                                                   finish();
  
                                               }
                                           }
              );
  
              popupWindow.showAsDropDown(btnOpenPopup, 50, -30);
          }
  
      });
  }
  
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu; this adds items to the action bar if it is present.
      getMenuInflater().inflate(R.menu.poupup_menu, menu);
      return true;
  }}
  </code></pre>