Android - finish()方法上的StartActivityForResult冻结了UI

时间:2016-07-19 12:32:22

标签: java android arraylist

我有以下情况:

  1. 活动A通过使用startActivityForResult
  2. 启动活动B.
  3. 活动B然后使用ArrayListfinish()字符串返回到活动A.
  4. 以下是活动B的作用的代码示例:

    ArrayList<String> urls = new ArrayList<>();
    urls.add("Some string");
    
    Intent intent = new Intent();
    intent.putStringArrayListExtra(KEY, urls);
    setResult(Activity.RESULT_OK, intent);
    finish();
    

    然后,活动A接收onActivityResult(...)

    中的数据

    我遇到的问题是当用户点击完成按钮并且活动B的代码示例执行时,活动B冻结约3秒(当我在ArrayList中有大约2个字符串时)。我ArrayList中的字符串越多,冻结的时间就越长。我或多或少地确定导致UI线程冻结的是finish()

    有没有办法在没有冻结活动B的情况下拨打finish()?如果没有,为什么会发生这种情况?

    编辑: 以下是完整的示例:

       /**
        * 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();
           }
       }
    

    但是我可以删除AsyncTask中的所有内容,因为它对性能没有任何影响。

1 个答案:

答案 0 :(得分:1)

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