在我的java代码中,按钮点击时有一个事件,它执行一些操作,如下所示
onclick->asynctask[openreader]>如果(未打开,返回)->否则继续处理onclick
实际发生的事情是单击一个按钮,比如说需要在该单击中处理一个方法,但是在启动该进程之前,我必须执行/检查位于该进程启动和异步任务之间的openreader,所以,当我单击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;
}
}
最佳答案
解决方案:
只需将单击视图的id
与openReader
类的构造函数一起传递,然后在onPostExecute
方法中使用switch
case。
例子:
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;
}
}
}
编辑:
如果你想清除方法内部的混乱,
你可以这样做,
@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;
}
}
我希望这会有帮助!啊!