【发布时间】:2015-02-15 00:19:15
【问题描述】:
如果您认为问题描述不正确,请更正标题。
我想通过一个实现的接口设置一个类变量,然后返回给另一个调用这个函数的类。
这里是代码。我使用 AsyncTask 和 Interface 的直接组合从 onPostExecute 返回一个对象:
public boolean isUserLoggedIn() throws ExecutionException, InterruptedException {
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("tag", is_user_logged_in_tag));
jsonParser = new DbHandler(new DBinterface() {
@Override
public void onRemoteCallComplete(JSONObject jsonFromNet) throws JSONException, ExecutionException, InterruptedException {
if (Integer.parseInt(jsonFromNet.getString("num_rows")) > 0) {
isLoggedIn = true;
} else {
isLoggedIn = false;
}
}
}, params).execute();
System.out.println("DEBUG[10] " + isLoggedIn);
return isLoggedIn;
}
isLoggedIn 声明为:
私有布尔 isLoggedIn = false;
所以我使用另一个类的这个函数来检查用户是否登录:
public class DashboardActivity extends Activity {
userFunctions = new UserFunctions(this);
userFunctions.isUserLoggedIn();
try {
if(userFunctions.isUserLoggedIn()){
//It nevers enters here as isUserLoggedIn always return the initial FALSE value.
setContentView(R.layout.dashboard);
btnLogout = (Button) findViewById(R.id.btnLogout);
.....
.....
}
我的问题是 isLoggedIn 仍然 always false,因为我使用 AsyncTask 查询数据库以检查用户是否已登录。即使使用 get() 方法它也不起作用。
AsyncTask 的 onPostExecute:
@Override
protected void onPostExecute(JSONObject jsonObject) {
super.onPostExecute(jsonObject);
try {
System.out.println(jsonObject.toString(1));
intf.onRemoteCallComplete(jsonObject);
} catch (Exception e) {
e.printStackTrace();
}
}
解决方案:
public class DashboardActivity extends Activity implements MyCallback {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dummy_layout);
// Check login status in database
userFunctions = new UserFunctions(this);
try {
userFunctions.isUserLoggedIn(this);
...
...
}
@Override
public void onRemoteCallComplete(JSONObject jsonFromNet) throws JSONException, ExecutionException, InterruptedException {
checkUserState(jsonFromNet.getString("num_rows"));
}
private void checkUserState(String num_rows) {
if (Integer.parseInt(num_rows) > 0) {
pDialog.dismiss();
setContentView(R.layout.dashboard);
btnLogout = (Button) findViewById(R.id.btnLogout);
btnLogout.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
// TODO Auto-generated method stub
try {
userFunctions.logoutUser(new MyCallback() {
@Override
public void onRemoteCallComplete(JSONObject jsonFromNet) throws JSONException, ExecutionException, InterruptedException {
}
});
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
Intent login = new Intent(getApplicationContext(), MainActivity.class);
login.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(login);
// Closing dashboard screen
finish();
}
});
} else {
// user is not logged in show login screen
Intent login = new Intent(getApplicationContext(), MainActivity.class);
login.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(login);
// Closing dashboard screen
finish();
}
}
这是经过简化的 isUserLoggedIn:
public void isUserLoggedIn(MyCallback callback) throws ExecutionException, InterruptedException {
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("tag", is_user_logged_in_tag));
jsonParser = (DbHandler) new DbHandler(activity, callback, params).execute();
}
【问题讨论】:
-
因为 AsyncTask 还没有完成?
-
是的,我知道。这就是我寻求帮助的原因...
标签: java android interface android-asynctask