活动到片段方法调用带有进度条的线程

问题描述 投票:0回答:3

我正在使用此代码,一切正常,但进度条没有显示。我想在方法实现期间阻止我的ui并想显示进度条。我想获得像progressDialog这样的行为。这是我的方法

public void effct(int effectNo) {
        final int finalEffectNO = effectNo;
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
        progressLayout.setVisibility(View.VISIBLE);
        progressLayoutLinear.setVisibility(View.VISIBLE);

        Thread thread = new Thread(){
            @Override
            public void run() {

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        imageViewFragment.applyEffect(finalEffectNO);
                        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
                        progressLayout.setVisibility(View.GONE);
                        progressLayoutLinear.setVisibility(View.GONE);

                    }
                });
            }
        };
        thread.start();
    }

我的progressLayout的xml代码

<LinearLayout
            android:id="@+id/progressBarLinearLayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@color/colorPrimaryDark"
            android:gravity="center"
            android:layout_centerVertical="true"
            android:layout_centerHorizontal="true"
            android:padding="12dp"
            android:visibility="gone"
            android:orientation="horizontal">

            <ProgressBar
                android:id="@+id/progressBar"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_marginRight="10dp"/>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Loading"
                android:textColor="#FFFFFF"
                android:textStyle="bold"
                android:textSize="18sp"/>

        </LinearLayout>
android android-fragments
3个回答
1
投票

对于您的要求,您必须使用ProgressDialog,这是一个示例

Example


1
投票

尝试使用AsyncTask而不是Thread,如下所示:

   new AsyncTask<Void, Void, Void>() {
        @Override
        protected void onPreExecute() {
            progressLayoutLinear.setVisibility(View.VISIBLE);
        }

        @Override
        protected Void doInBackground(final Void ... params ) {

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    imageViewFragment.applyEffect(finalEffectNO);
                    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
                }
            });

            return null;
        }

        @Override
        protected void onPostExecute( final Void result ) {
            progressLayoutLinear.setVisibility(View.GONE);


        }
    }.execute();

希望这可以帮助


1
投票

有几种方法可以解决您的问题 - 请查看this video以获取更多信息。最基本的方法可能是AsyncTask,它可能如下所示:

public class DummyAsyncTask extends AsyncTask<Void, Void, Void> {
  private final Window window;
  private final ProgressBar progressBar;

  public DummyAsyncTask(Window window, ProgressBar progressBar) {
    this.window = window;
    this.progressBar = progressBar;
  }

  @Override protected void onPreExecute() {
    window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
    progressBar.setVisibility(View.VISIBLE);
  }

  @Override protected Void doInBackground(Void... voids) {
    // Do the heavy lifting.
  }

  @Override protected void onPostExecute(Void aVoid) {
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
    progressBar.setVisibility(View.GONE);
  }
}

你通过运行new DummyAsyncTask(/* params */).execute();来执行它。

请注意,AsyncTask不遵守生命周期,并且持有对Context感知实例的引用只是在寻找麻烦。更安全的替代方案可能是使用LiveData

public void effect(int effectNo) {
  // Show progress and disable user interaction here.

  final ListData<Content> data = model.applyEffect(effectNo);
  data.observe(this, (Observer<Content>) c -> {
    // Apply results, hide progress & enable user interaction.
  });
}

鉴于上述情况,您应该小心如何处理显示和隐藏进度,这样您就不会意外地永久禁用用户交互。

© www.soinside.com 2019 - 2024. All rights reserved.