我使用带有修订API 23的设备,并且因为我认为使用ProgressDialog会很容易,因为它仍然可用。
我试图启动一个需要做大量工作的线程,而在他执行此操作时,用户必须等待。
在使用ProgressDialog时遇到其他问题:
public void buttun(View view) {
ProgressDialog mProgressDialog = new ProgressDialog(this);
mProgressDialog.show(this,"Title","Message",true);
addCustomQueue.start();
getCustomQueue.start();
mProgressDialog.dismiss();
}
在这种情况下,单击按钮将显示ProgressDialog,但是.dismiss()
不起作用。 (我知道即使线程未完成,ProgessDialog也应立即关闭。我只是想知道.dismiss()
是否有效。)
public void buttun(View view) {
ProgressDialog mProgressDialog = new ProgressDialog(this);
mProgressDialog.show(this,"Title","Message",true);
addCustomQueue.start();
getCustomQueue.start();
try {
addCustomQueue.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
mProgressDialog.dismiss();
}
当我尝试{肯定会在20秒后结束的”一个线程时,ProgressDialog将在大约30秒后显示,并且.join()
也将不起作用。但是我得到了有关线程完成的信息。
我要使用的样式是第二个样式,但是我需要一种适当的方式来实现。 正确的用法是什么?
答案 0 :(得分:1)
您正在创建两个Progressdialog
对象。
//Instead of
//ProgressDialog mProgressDialog = new ProgressDialog(this);
//mProgressDialog.show(this,"Title","Message",true);
//use
ProgressDialog mProgressDialog = ProgressDialog.show(this,"Title","Message",true);
//Now, you'll be able to dismiss it
mProgressDialog.dismiss();
这不是最直观的方法,但是静态show(..)
方法会创建并显示进度对话框。 (Reference)
static ProgressDialog show(Context context, CharSequence title, CharSequence message, boolean indeterminate)
创建并显示一个ProgressDialog。
P.S-Reyhane的答案也应该起作用,因为show()
方法是一种对象级方法,它直接显示对话框而不是创建对话框并显示。 (Reference)
答案 1 :(得分:1)
实际上,ProgressDialog.show(Context, String, String, boolean)
是一个静态方法,它创建一个新的ProgressDialog并在显示它之后将其返回。
您应该像这样更改代码。
ProgressDialog mProgressDialog = ProgressDialog.show(this,"Title","Message",true);
mProgressDialog.dismiss();
您应该从不禁止阻塞Android的MainThread,因此在MainThread上加入线程不是一个好主意。
您可以使用Handler在MainThread上发布回调,而不是在MainThread上加入长时间运行的线程。
您的活动:
public class MainActivity extends AppCompatActivity {
private ProgressDialog mProgressDialog;
private AddCustomQueueThread addCustomQueue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addCustomQueue = new AddCustomQueueThread(this);
}
public void dismissProgressDialog() {
if(mProgressDialog != null) {
mProgressDialog.dismiss();
mProgressDialog = null;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mProgressDialog != null) {
mProgressDialog.dismiss();
mProgressDialog = null;
}
}
public void button(View view) {
addCustomQueue.start();
mProgressDialog = ProgressDialog.show(this,"Title","Message",true);
}
}
您的主题:
class AddCustomQueueThread extends Thread {
final WeakReference<MainActivity> activity;
final Handler handler;
AddCustomQueueThread(MainActivity act) {
activity = new WeakReference<>(act);
handler = new Handler(Looper.getMainLooper());
}
@Override
public void run() {
super.run();
//do your work.
handler.post(new Runnable() {
@Override
public void run() {
MainActivity act = activity.get();
if(act != null) {
act.dismissProgressDialog();
}
}
});
}
}
请注意:我们将对活动的引用存储在WeakReference内,这是防止您的活动泄漏所必需的。
答案 2 :(得分:0)
new Thread(new Runnable() {
@Override
public void run() {
// Here you can do your background task for processing data that may take seconds
addCustomQueue.start();
getCustomQueue.start();
try {
addCustomQueue.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
runOnUiThread(new Runnable() {
@Override
public void run() {
// Here you can put code for UI changes that display on screen
if (mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
}
}
});
您可以通过适当的多重处理性能来管理它,在这里,我仅向您提供示例,因为我不知道您的功能和代码。
答案 3 :(得分:0)
在开始工作之前,您应该编写以下代码:
final ProgressDialog pd = new ProgressDialog(this);
pd.setMessage("Processing...");
pd.setCancelable(false);
pd.show();
,在结束工作后写成这样:
pd.cancel();