Android 等待AsyncTask完成,然后在进程中“继续”

Android 等待AsyncTask完成,然后在进程中“继续”,android,android-asynctask,Android,Android Asynctask,在我的java代码中,我有一个单击按钮的事件,它执行一些操作,如下所示 OnClick->AsyncTask[OpenReader]->如果未打开,返回->否则继续OnClick过程 实际发生的是一个按钮被点击,比如说在点击过程中需要处理一个方法,但在启动该过程之前,我必须执行/检查openReader,它实际上处于该过程启动之间,并且是一个异步任务,所以,当我单击openReader call initiated(openReader call initiated)时,会发生什么情况?在这之前

在我的java代码中,我有一个单击按钮的事件,它执行一些操作,如下所示

OnClick->AsyncTask[OpenReader]->如果未打开,返回->否则继续OnClick过程

实际发生的是一个按钮被点击,比如说在点击过程中需要处理一个方法,但在启动该过程之前,我必须执行/检查openReader,它实际上处于该过程启动之间,并且是一个异步任务,所以,当我单击openReader call initiated(openReader call initiated)时,会发生什么情况?在这之前,我的流程在启动后不会启动,直到AsyncTask完成。现在,如果我通过while循环等待AsyncTask完成,它会挂起GUI,那么可能的解决方案是什么

@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;
           }

}