2

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

OnClick -> AsyncTask [OpenReader] -> if(未打开,返回) -> else 继续处理 onClick

实际发生的是单击了一个按钮,说在该单击中需要处理一个方法,但是在启动该过程之前,我必须执行/检查实际上在该过程启动之间并且是一个 AsyncTask 的 openReader,所以什么发生的情况是当我单击 openReader 调用启动并在此之前完成我的进程之后启动它不应该开始直到 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;
    }
}
4

2 回答 2

3

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

于 2013-05-23T05:58:47.970 回答
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;
           }

}

我希望它会有所帮助!

于 2013-05-23T06:10:29.870 回答