是否有更简单/更简单的方法来执行以下操作?我在类中有一个方法,在线程运行时显示进度条。这段代码有效,但看起来有点过于笨重,有3个步骤。
private void pause() {
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mProgressBar.setVisibility(View.VISIBLE);
}
});
new Thread(new Runnable() {
@Override
public void run() {
try {
//do stuff
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mProgressBar.setVisibility(View.GONE);
}
});
}
答案 0 :(得分:0)
在线程运行时,这不会显示进度条。
你的线程可以运行10秒,但是如果你可以看到它,那么ProgressBar的可见性只会闪烁。
相反,你应该只在线程完成后隐藏,所以这是正确的:
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mProgressBar.setVisibility(View.VISIBLE);
}
});
new Thread(new Runnable() {
@Override
public void run() {
try {
//do stuff
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mProgressBar.setVisibility(View.GONE);
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
对于" slicker"您可以使用为此任务创建的AsyncTask。例如:
new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
// Guaranteed to run on the UI thread
mProgressBar.setVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(Void... params) {
// Do stuff
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
// Guaranteed to run on the UI thread
mProgressBar.setVisibility(View.GONE);
}
}.execute();
答案 1 :(得分:0)
在这里,您可以使用处理程序概念与UI Thread进行通信。
是的,Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch(msg.what){
case 1:
mProgressBar.setVisibility(View.VISIBLE);
break;
case 2:
mProgressBar.setVisibility(View.GONE);
break;
}
}
}
new Thread(new Runnable() {
@Override
public void run() {
Message processStart = handler.obtainMessage(1);
processStart.sendToTarget();
try {
//do stuff
} catch (InterruptedException e) {
e.printStackTrace();
}
Message processStart = handler.obtainMessage(2);
processStart.sendToTarget();
}
}).start();
我希望这个会帮助你:)。