Android 等待AsyncTask完成,然后在进程中“继续”
在我的java代码中,我有一个单击按钮的事件,它执行一些操作,如下所示 OnClick->AsyncTask[OpenReader]->如果未打开,返回->否则继续OnClick过程 实际发生的是一个按钮被点击,比如说在点击过程中需要处理一个方法,但在启动该过程之前,我必须执行/检查openReader,它实际上处于该过程启动之间,并且是一个异步任务,所以,当我单击openReader call initiated(openReader call initiated)时,会发生什么情况?在这之前,我的流程在启动后不会启动,直到AsyncTask完成。现在,如果我通过while循环等待AsyncTask完成,它会挂起GUI,那么可能的解决方案是什么Android 等待AsyncTask完成,然后在进程中“继续”,android,android-asynctask,Android,Android Asynctask,在我的java代码中,我有一个单击按钮的事件,它执行一些操作,如下所示 OnClick->AsyncTask[OpenReader]->如果未打开,返回->否则继续OnClick过程 实际发生的是一个按钮被点击,比如说在点击过程中需要处理一个方法,但在启动该过程之前,我必须执行/检查openReader,它实际上处于该过程启动之间,并且是一个异步任务,所以,当我单击openReader call initiated(openReader call initiated)时,会发生什么情况?在这之前
@Override
public void onClick(View v) {
logMsg("....", R.color.GREEN);
String phNum = phoneNumber.getText().toString();
// Check if phone number is valid
if (!checkNumber(phNum)) {
required.setTextColor(Color.RED);
validNum = false;
return;
}
isReady = false;
// Prepare device for use
new openReader().execute();
// Have to wait for openReader to finish here
// and then proceed
int id = v.getId();
switch (id) {
case R.id.btnRead:
flag = 1;
// Process to be initiated here
break;
default:
break;
}
}
看。将AsyncTask完成后需要运行的所有代码放入此方法中。请参阅。将异步任务完成后需要运行的任何代码放入此方法中。解决方案:
只需将单击视图的id与openReader类的构造函数一起传递,然后在onPostExecute方法中使用switch case
例如:
这就是openReader类的外观
private class openReader extends AsyncTask<Void, Void, Void>
{
private int selected_v_id;
public openReader(int i) {
// TODO Auto-generated constructor stub
selected_v_id= i;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
switch (selected_v_id) {
case R.id.btnRead:
flag = 1;
// Process to be initiated here
break;
default:
break;
}
}
}
我希望这会有帮助 解决方案:
只需将单击视图的id与openReader类的构造函数一起传递,然后在onPostExecute方法中使用switch case
例如:
这就是openReader类的外观
private class openReader extends AsyncTask<Void, Void, Void>
{
private int selected_v_id;
public openReader(int i) {
// TODO Auto-generated constructor stub
selected_v_id= i;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
switch (selected_v_id) {
case R.id.btnRead:
flag = 1;
// Process to be initiated here
break;
default:
break;
}
}
}
我希望这会有帮助 你有异步类的onPostExecute方法,你用过吗?是的,我用过,但在这种情况下,请阅读我下面的评论。我认为这是最好的方法,你可以为这个开关创建一个方法,并从OnPsoteExecute调用该方法,如果你还想阻止任何进一步的用户交互,你可以启动progress Dialogo你有异步类的PostExecute方法,你用过吗?是的,我用过,但没有在这种情况下,阅读我下面的评论我认为这是最好的方法,你可以为这个开关创建一个方法,并从OnPSoteExecute调用该方法,如果你还想阻止任何进一步的用户交互,你可以启动progress Dialogy是的,我有这个方法,知道如何使用它,但在我的情况下,当我点击按钮时,它会得到该按钮的ID,并根据该按钮执行操作,如果我使用onPostExecute方法,我必须将我想要避免的所有开关代码放在那里,这就是为什么我需要一个解决办法…@Saqib:看看我的答案,它能处理你需要的。是的,我有这个方法,知道如何使用它,但在我的情况下,当我点击按钮时,它会得到该按钮的ID,并根据该按钮执行操作,如果我使用onPostExecute方法,我将不得不将所有我想要避免的开关代码放在那里,这就是为什么我需要一个解决方案…@Saqib:看看我的答案,它能满足你的需要。好吧,这是一个更好的解决方案,我投了赞成票,但我会在实施后尽快接受答案。谢谢,这是一个更好更体面的解决方案,我投了赞成票,但我会在实施后尽快接受答案。谢谢
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
performAction(selected_v_id);
}
private void performAction(int x)
{
switch (selected_v_id) {
case R.id.btnRead:
flag = 1;
// Process to be initiated here
break;
default:
break;
}
}