简体   繁体   中英

Android - StartActivityForResult on finish() method freezes UI

I have the following situation:

  1. Activity A starts Activity B, by using startActivityForResult
  2. Activity B then returns an ArrayList of Strings to Activity A by using on finish() .

Here is a code example of what exactly Activity B does:

ArrayList<String> urls = new ArrayList<>();
urls.add("Some string");

Intent intent = new Intent();
intent.putStringArrayListExtra(KEY, urls);
setResult(Activity.RESULT_OK, intent);
finish();

Then Activity A receive the data in onActivityResult(...)

The issue I have is that when the user taps the done button and Activity B's code example executes, Activity B freezes for about 3 seconds (when I have about 2 strings in the ArrayList ). The more strings I have in the ArrayList the longer it freezes. I have more or less determined that it is finish() that causes the UI thread to freeze.

Is there a way to call finish() without freezing Activity B? If not, why is this happening?

EDIT: Here is the full example:

   /**
    * Background task
    */
   private class gatherUrlsTask extends AsyncTask<ArrayList<PictureEntry>, Integer, Intent> {

       @Override
       protected void onPreExecute() {
           progressBar.setVisibility(View.VISIBLE);
           bt_done.setVisibility(View.GONE);
           fab_add_picture.setVisibility(View.GONE);
       }

       @SafeVarargs
       @Override
       protected final Intent doInBackground(ArrayList<PictureEntry>... params) {
           ArrayList<String> imagePaths = new ArrayList<>();

           for (PictureEntry pictureEntry : params[0]) {
               if (pictureEntry.isSelected()) {
                   imagePaths.add(pictureEntry.getPath());
               }
           }

           if (imagePaths.size() == 0) {
               Toast.makeText(getApplicationContext(), R.string.please_select_atleast_one_image, Toast.LENGTH_LONG).show();
               return null;
           } else {
               Intent intent = new Intent();
               intent.putStringArrayListExtra(SELECTED_IMAGES_KEY, imagePaths);
               return intent;
           }
       }

       @Override
       protected void onPostExecute(Intent intent) {
           setResult(Activity.RESULT_OK, intent);
           finish();
       }
   }

However I can remove everything from the AsyncTask since it did not have any effect on performance.

我不知道是什么原因造成的,但是为了防止ui冻结,请使用asyncTask,然后在onPostExcecute调用finish()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM