等待AsyncTask在'PROCEEDING'进行之前完成

时间:2013-05-23 05:54:42

标签: android android-asynctask

在我的java代码中,我在按钮点击时有一个事件,它执行一些操作,这些操作位于

之下

OnClick - > AsyncTask [OpenReader] - > if(not open,return) - >否则继续执行onClick

实际发生的是单击一个按钮,说有一个方法需要在该单击中处理,但在启动该进程之前,我必须执行/检查实际处于该进程启动之间的openReader并且是一个AsyncTask ,所以当我点击openReader调用启动时,在此之前启动我的进程,直到完成AsyncTask后才开始,现在如果我等待AsyncTask通过while循环完成它挂起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;
    }
}

2 个答案:

答案 0 :(得分:3)

AsyncTask.onPostExecute()。放置在此方法中AsyncTask完成后需要运行的任何代码。

答案 1 :(得分:1)

<强>解决方案: 只需将您点击的视图idopenReader类的构造函数一起传递,然后在onPostExecute方法中使用switch大小写。

示例:

int id = v.getId();
new openReader(id).execute();

这就是你的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方法中的混乱, 你可以做这样的事情,

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

}

我希望它会有所帮助!!