How to wait for an activity to finish in asynctask

三世轮回 提交于 2019-12-12 02:26:18

问题


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?

Here is my code:

 public class ListSpdFiles extends AsyncTask<Void, Void, String[]> {
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<List<String>> result = pcas.lsdir(initiator, path);  // the lsdir call to the
    boolean crtbut = createbutt;
    boolean dlbut= deletebutt;
    ArrayList<String> mylist = new ArrayList<String>();
    final Global globalVariable = (Global) applicationContext;
    if (crtbut==false && 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 > -1) && (url_column_index > -1) && (row_count > 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;
}}

My Activity class:

public class PopUp  extends Activity  {

private static final String TAG = "PopUp";
ArrayList<String> value = null;

ArrayList<String> 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<String> adapter = new ArrayAdapter<String>(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<?> arg0, View arg1, int arg2, long arg3) {

                    globalVariable.setUsername(usernames.get(arg2));



                }

                @Override
                public void onNothingSelected(AdapterView<?> 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;
}}

来源:https://stackoverflow.com/questions/35579932/how-to-wait-for-an-activity-to-finish-in-asynctask

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!