【问题标题】:Progress bar visiblity gone causing progress bar to not appear in first place进度条可见性消失导致进度条没有出现在第一位
【发布时间】:2019-09-06 22:27:12
【问题描述】:

我有一个用 xml 编写的进度条,初始可见性为“已消失”。我想在开始共享视频/数据处理时使进度条“可见”,并在共享视频/数据处理完成时使进度条“消失”。

我首先尝试简单地做

ProgressBar PB=(ProgressBar) activity.findViewById(R.id.ProgressBar);

PB.setVisibility(View.VISIBLE);

shareVideo(finalVideoTitle, finalVideoLink, activity);

PB.setVisiblity(View.GONE);

在那之后不起作用,我尝试了:

ProgressBar PB=(ProgressBar) activity.findViewById(R.id.ProgressBar);

activity.runOnUiThread(new Runnable() {
                       @Override
                        public void run() {
                            PB.setVisibility(View.VISIBLE);
                        }
                    });

shareVideo(finalVideoTitle, finalVideoLink, activity);

activity.runOnUiThread(new Runnable() {
                       @Override
                        public void run() {
                            PB.setVisibility(View.GONE);
                        }
                    });

这两种尝试都没有奏效。但是我注意到,如果我去掉将可见性设置为“已消失”的代码,进度条会显示,但显然不会被忽略。

在 shareVideo() 中,我有:

 private static void shareVideo(String videoTitle, String videoPath, MainActivity activity){
        // find the video file
        String videoPathforTrimmed = videoPath.substring(0, videoPath.length() - 4)+"Trimmed.mp4";
        String videoTitleTrimmed = videoTitle+"Trimmed";
        File file = new File(videoPathforTrimmed);
        long lengthInBytes = file.length();
        mAlertDialog.dismiss();

        if (!file.exists() || (lengthInBytes == 0)) {
            try {
                trimAndDuplicateVideo(videoPath,videoTitleTrimmed, videoPathforTrimmed, activity);
            }
            catch(IOException e)
            {
                System.out.println(e);
                return;
            }
        }


        Uri videoUri = Uri.parse("file:"+videoPathforTrimmed);

        try {
            Thread.sleep(2000);
        }
        catch(Exception e)
        {

        }


        try {
            Thread.sleep(500);
        }
        catch(Exception e)
        {

        }
        /*
        try {
            TimeUnit.SECONDS.sleep(4);
        }
        catch (Exception e)
        {

        }
        */

        ContentResolver resolver = activity.getContentResolver();
        String[] columns = {MediaStore.MediaColumns._ID};
        String selection = MediaStore.Video.VideoColumns.DATA + "=?";
        String selectionArgs[] = { videoPathforTrimmed };

        Cursor cursor = resolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                columns,
                selection,
                selectionArgs,
                null);

       if( cursor.getCount() > 0) {
            cursor.moveToFirst();
            videoUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
            videoUri = Uri.withAppendedPath(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
            Integer.toString(cursor.getInt(0)));
            shareVideoIntentBestLap(videoTitleTrimmed, videoUri, activity);
        }
        else {
            videoNotRecognizedPopup(activity);
      }

    }

在 trimAndDuplicateVideo() 中,我使用 mp4parser 修剪视频并将保存的视频输出到新文件。

这是位于线性布局中的进度条的 xml:


    <ProgressBar
        android:id="@+id/videoTrimProgressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:indeterminate="true"
        android:max="100"
        android:backgroundTint="@color/white"
        android:minHeight="270dp"
        android:visibility="gone"
        android:indeterminateTint="#1a09d6"
        android:layout_marginTop="-7dp"/>

【问题讨论】:

  • 你能把dataProcessing()里面的内容发布出来吗?
  • 数据处理代码涉及到使用第三方库进行视频处理,很长。但是,独特的是我在其中有 Thread.sleep(ms) 。尝试 { Thread.sleep(2000); } catch(Exception e) { } //pd.dismiss();尝试{ Thread.sleep(500); } 捕捉(异常 e){ }
  • 如果dataProcessing() 中的代码在不同的线程上运行(而不是在 UI 上),那么这就是问题所在。由于不是阻塞函数,启动函数后,下一行:PB.setVisiblity(View.GONE);会立即执行
  • 正如@LucaNicoletti dataProcessing() 所提到的,方法无法按照您想象的方式执行。如果您对 Kotlin 感兴趣,您应该使用 Thread、AsyncTask 或 Coroutines 等后台处理 API 之一,然后在处理发生时将进度回传。
  • @LucaNicoletti 这很有道理,但我找不到让程序等待几秒钟的好方法;我试过 Thread.sleep(ms) 和 TimeUnit.SECONDS.sleep(4);

标签: java android xml android-layout android-progressbar


【解决方案1】:

使用asynctask 类并覆盖其方法:

   @Override
    protected void onPreExecute() {
        super.onPreExecute();
        PB.setVisibility(View.VISIBLE);
    }

   @Override
    protected String doInBackground(String... params) {
    shareVideo(finalVideoTitle, finalVideoLink, activity);
    }

   @Override
    protected void onPostExecute(String result){
     PB.setVisiblity(View.GONE);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    相关资源
    最近更新 更多