活动到片段方法调用带有进度条的线程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了活动到片段方法调用带有进度条的线程相关的知识,希望对你有一定的参考价值。
我正在使用此代码,一切正常,但进度条没有显示。我想在方法实现期间阻止我的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>
答案
对于您的要求,您必须使用ProgressDialog,这是一个示例
另一答案
尝试使用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();
希望这可以帮助
另一答案
有几种方法可以解决您的问题 - 请查看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.
});
}
鉴于上述情况,您应该小心如何处理显示和隐藏进度,这样您就不会意外地永久禁用用户交互。
以上是关于活动到片段方法调用带有进度条的线程的主要内容,如果未能解决你的问题,请参考以下文章