从接口实现的函数和 AsyncTask 中设置 class 变量

Set class variable from interface implemented function and AsyncTask

如果您认为标题没有正确描述问题,请更正标题。

我想通过已实现的接口设置一个 class 变量,然后 return 将其设置为调用此函数的另一个 class。

这是代码。我使用 AsyncTask 和接口的直接组合到 return 一个 object 来自 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 声明为:

private boolean isLoggedIn = false;

所以我使用另一个class的这个函数来检查用户是否登录:

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();
}

您可以将变量存储在存储的首选项中。

在异步任务的 post 执行中,如果登录是肯定的,则像这样存储结果:

 SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putInt("LOGGEDIN", "1");
    editor.commit();

然后像这样读取你的变量:

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);

    String loggedin = sharedPref.getString("LOGGEDIN"), "0");

在私有方法中设置上面的读取以检查 logIn,其中 returns boolean isLoggedIn。

问题是 isUserLoggedIn() 方法 returns 立即具有当前状态,但它已在 DbHandler 过程中启动。所以 isUserLoggedIn() 的调用者不是在等待结果。将您的 Activity 代码修改为 运行 检查登录状态(因此将 isUserLoggedIn() 修改为 checkUserLoginStatus()。在 AsyncTask.onPostExecute() 中,您需要 "notify" 最新状态的 Activity。在这里要小心,因为你需要确保你的 AsyncTask 与你的 Activity 的生命周期仔细协调。它不是生命周期知道,所以如果您尝试直接操作 UI 组件并且 Activity 不处于 运行ning 状态,则有可能获得 IllegalStateException