我有一个安卓应用程序(用Java编写),其中有两个按钮(连接和请求数据)。
每当点击一个按钮时,都会执行一个任务,并出现一个“进度对话框”来显示任务完成了多少。
为了显示进度对话框,每当点击一个按钮时,任务就在一个线程上运行。
“连接”按钮只有一个任务-在线程上运行。然而,“请求数据”按钮执行两个任务-第一个任务与连接按钮类似,在线程上运行,但还有第二个任务“refreshInfo()”,必须在第一个任务“progThread”完成后运行。
这里的关键方法是performAction(int type)。我不想让该方法完成,直到progThread运行完成。如您所见,我已经尝试使用progThread.join()来防止方法继续运行,直到progThread完成运行。但由于progThread涉及显示进度对话框,运行progThread.join()似乎会阻止进度对话框的显示,因为当前当您单击按钮时,第一个任务正在执行,但对话框仅在最后闪现。有人能想到一种方法来运行线程,正常显示进度对话框,然后运行第二个方法吗(如果有的话)?如果需要,我已经包含了线程代码。
每当点击一个按钮时,都会执行一个任务,并出现一个“进度对话框”来显示任务完成了多少。
为了显示进度对话框,每当点击一个按钮时,任务就在一个线程上运行。
“连接”按钮只有一个任务-在线程上运行。然而,“请求数据”按钮执行两个任务-第一个任务与连接按钮类似,在线程上运行,但还有第二个任务“refreshInfo()”,必须在第一个任务“progThread”完成后运行。
private Button connectButton;
private Button requestDataButton;
private ProgressDialog connectionDialog;
private ProgressDialog requestDataDialog;
private ProgressThread progThread;
private int currentDialog;
public void connectClick(View view) //When the connect button is clicked
{
performAction(1); //Run the thread to perform the action
}
public void requestDownloadClick(View view) //When the request data button is clicked
{
performAction(2); //Run the thread to perform the action
refreshInfo(); //Do something else
}
private void performAction(int type)
{
currentDialog = type;
showDialog(type);
try
{
progThread.join();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
这里的关键方法是performAction(int type)。我不想让该方法完成,直到progThread运行完成。如您所见,我已经尝试使用progThread.join()来防止方法继续运行,直到progThread完成运行。但由于progThread涉及显示进度对话框,运行progThread.join()似乎会阻止进度对话框的显示,因为当前当您单击按钮时,第一个任务正在执行,但对话框仅在最后闪现。有人能想到一种方法来运行线程,正常显示进度对话框,然后运行第二个方法吗(如果有的话)?如果需要,我已经包含了线程代码。
private class ProgressThread extends Thread
{
final static int DONE = 0;
final static int RUNNING = 1; // Class constants defining state of the thread
private Handler progressHandler;
int mState;
int total;
ProgressThread(Handler _handler) // Constructor with an argument that specifies Handler on main thread to which messages will be sent by this thread.
{
progressHandler = _handler;
}
public void run() // Invoked automatically when the Thread starts.
{
mState = RUNNING;
updateProgressBar();
connectButton = (Button) findViewById(R.id.btnConnect);
requestDataButton = (Button) findViewById(R.id.btnRequestDownload);
while (mState == RUNNING)
{
if (currentDialog == 1)
{
try
{
doSomething();
if (something)
{
setState(DONE);
total = 100;
updateProgressBar();
removeDialog(1);
connectButton.setEnabled(false);
}
else
{
total = total + 20;
if (something has reached a limit)
{
setState(DONE);
total = 0;
updateProgressBar();
removeDialog(1);
}
}
updateProgressBar();
}
catch (Exception e)
{
}
}
if (currentDialog == 2)
{
try
{
doSomething();
total = 10;
updateProgressBar();
doSomething();
total = 70;
updateProgressBar();
if (something) //If the download info has not been got
{
setState(DONE);
total = 0;
updateProgressBar();
removeDialog(2);
runOnUiThread(new Runnable()
{
public void run()
{
connectButton.setEnabled(true);
requestDataButton.setEnabled(true);
}
});
}
else
{
total = 100;
updateProgressBar();
setState(DONE);
removeDialog(2);
runOnUiThread(new Runnable()
{
public void run()
{
requestDataButton.setEnabled(false);
}
});
}
}
catch (Exception e)
{
removeDialog(2);
setState(DONE);
runOnUiThread(new Runnable()
{
public void run()
{
connectButton.setEnabled(true);
requestDataButton.setEnabled(true);
}
});
}
}
}
}
// Set current state of thread (use state=ProgressThread.DONE to stop thread)
public void setState(int state)
{
mState = state;
}
public void updateProgressBar()
{
Message msg = progressHandler.obtainMessage(); // Send message (with current value of total as data) to Handler on UI thread so that it can update the progress bar
Bundle b = new Bundle();
b.putInt("total", total);
msg.setData(b);
progressHandler.sendMessage(msg);
}
}
final Handler handler = new Handler() // Handler on the main (UI) thread that will receive messages from the second thread and update the progress.
{
public void handleMessage(Message msg)
{
int total = msg.getData().getInt("total"); // Get the current value of the variable total from the message data and update the progress bar
switch (currentDialog)
{
case 1 :
connectionDialog.setProgress(total);
break;
case 2 :
requestDataDialog.setProgress(total);
break;
}
}
};
protected Dialog onCreateDialog(int id)
{
switch (currentDialog)
{
case 1 :
connectionDialog = new ProgressDialog(this);
connectionDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
connectionDialog.setMax(100);
connectionDialog.setProgress(0);
connectionDialog.setMessage("Connecting To The Device");
progThread = new ProgressThread(handler);
progThread.start();
return connectionDialog;
case 2 :
requestDataDialog = new ProgressDialog(this);
requestDataDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
requestDataDialog.setMax(100);
requestDataDialog.setProgress(0);
requestDataDialog.setMessage("Requesting Download Data");
progThread = new ProgressThread(handler);
progThread.start();
return requestDataDialog;
default :
return null;
}
}