【问题标题】:Cannot control Progressbar visibility from onActivityResult in Fragment无法从片段中的 onActivityResult 控制进度条的可见性
【发布时间】:2018-10-23 23:22:28
【问题描述】:

我有一个包含进度条的片段。我在onCreateView() 方法中检索它,setVisibility() 工作正常。

现在,当我尝试在onActivityResult() 中设置相同进度条的可见性(在类级别的片段中声明)时,什么也没有发生。这是代码。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
if(requestCode == REQUEST_CODE_PROFILE_VIDEO_PATH){
        if(resultCode == Activity.RESULT_OK) {
            String profileVideoPath = data.getExtras().getString(ProfileVideoRecordingActivity.VIDEO_PROFILE_PATH);
            Log.d("DEBUG", profileVideoPath);

            //Upload to server
            File profileVideo = new File(profileVideoPath);
            if(profileVideo.exists()) {

                pbarVideoUpload.setVisibility(View.VISIBLE);
                FireBaseWrapper fileUploader = new FireBaseWrapper();
                String serverFolderPath = "videoprofile";
                String contentType = "video/mp4";
                FireBaseAfterUpload afterUpload = new FireBaseAfterUpload() {
                    @Override
                    public void onSuccess(String uploadURL) {
                        Log.d("DEBUG", "Successfully uploaded video to server");
                        Log.d("DEBUG", uploadURL);
                        pbarVideoUpload.setVisibility(View.GONE);

                        ProfileService profileService = new ProfileService(TAG) {
                            @Override
                            protected void onPreServiceCall() {

                            }

                            @Override
                            protected void onPostServiceCall() {

                            }

                            @Override
                            public void afterSuccess(Object object) {
                                ReturnCode successCode = (ReturnCode) object;
                                if(successCode.getSuccess()){
                                    Log.d("DEBUG", "Profile Video URL updated in DB");
                                }else{
                                    Log.d("DEBUG", "Profile Video URL NOT updated in DB");
                                }
                            }

                            @Override
                            public void afterError() {
                                Log.d("DEBUG", "Profile Video URL NOT updated in DB");
                            }
                        };
                        profileService.updateVideoPath(uploadURL);

                    }

                    @Override
                    public void onProgress(String data) {

                    }

                    @Override
                    public void onFaliure() {
                        Log.d("DEBUG", "Error! Didn't upload");
                        pbarVideoUpload.setVisibility(View.GONE);
                    }
                };

                try {
                    fileUploader.upload(profileVideo, profileVideo.getName(), serverFolderPath, afterUpload, contentType, false);
                }catch (FileNotFoundException e){
                    Log.e("DEBUG", "FileNotFoundException", e);
                }
            }

        }
    }
}

我尝试在 Handler 内调用 setVisibility(),并在 UI 线程上使用 runOnUiThread()。两种方法都不起作用。

如何控制 Fragment 的onActivityResult() 内进度条的可见性?

我需要它,因为我正在onActivityResult() 中上传一个文件并且需要显示进度。

【问题讨论】:

    标签: android onactivityresult


    【解决方案1】:

    在 onActivityResult() 之后调用 Fragments onCreate()。因此视图被重新初始化并且没有显示进度条。

    创建了一个静态变量 isVideoUploading。在 onActivityResult() 中适当地设置它的值,并用它来显示/隐藏 onCreate() 中的进度条。 这解决了一半的问题。开始上传时,进度条现在可见。

    问题的后半部分是在 firebase 异步上传方法完成时隐藏进度条。问题是,由于上传是在 onActivityResult() 开始的后台线程中完成的,所以上传完成后 onCreateView() 无法再次触发。 为此,我在上传完成后使用 LocalBroadcastManager 发送了一个广播意图,并将其注册在同一个片段中。收到广播后,我隐藏了进度条。

    【讨论】:

      【解决方案2】:

      放这个

        pbarVideoUpload.setVisibility(View.GONE);
      

      这里面也有我提到的,

                                  @Override
                                  public void afterSuccess(Object object) {
                                      ReturnCode successCode = (ReturnCode) object;
                                      if(successCode.getSuccess()){
                                        pbarVideoUpload.setVisibility(View.GONE);
                                          Log.d("DEBUG", "Profile Video URL updated in DB");
                                      }else{
                                          Log.d("DEBUG", "Profile Video URL NOT updated in DB");
                                      }
                                  }
      

      【讨论】:

      • ProfileService 的 afterSuccess 方法不是用于实际的文件上传,它只是用于反映 url 是否成功保存在 db 中,这是一个相当短暂的任务。这就是为什么我将可见性代码放在 Firebase 上传事件处理程序的 afterSuccess 中。
      • 检查pbarVideoUpload是否为空?
      • 我刚刚检查了 pbarVideoUpload 在 onActivityResult() 和语句 pbarVideoUpload.setVisibility(View.VISIBLE) 中不为空;成功运行。然而,可见性不受影响:|
      • 检查Log.d("DEBUG", uploadURL); pbarVideoUpload.setVisibility(View.GONE);这一行
      • 那条线你想让我检查什么?
      【解决方案3】:

      我认为你 onActivityResult 没有像在片段中那样触发。请在包含片段的活动中使用以下代码。

      public void onActivityResult(int requestCode, int resultCode, Intent intent) {
      super.onActivityResult(requestCode, resultCode, intent);
      Fragment fragment = (Fragment) getSupportFragmentManager().findFragmentByTag(fragmentTag);
      if (fragment != null) {
          fragment.onActivityResult(requestCode, resultCode, intent);
      }
      }
      

      【讨论】:

      • 嗨。片段内部的 onActivityResult() 方法确实被调用了。该文件已成功上传,我也收到了日志消息。我不明白为什么进度条可见性不起作用。
      • 您的 setVisibility=true 和 setVisibility = false 之间是否有任何可见的持续时间?
      • 没有任何明确的计时器或任何倒计时,但 Firebase upload() 方法需要大约 4-7 秒来上传视频。我想在这段时间内显示不确定的进度条。
      猜你喜欢
      • 2015-07-01
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多