Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从接口实现的函数和异步任务设置类变量_Java_Android_Interface_Android Asynctask - Fatal编程技术网

Java 从接口实现的函数和异步任务设置类变量

Java 从接口实现的函数和异步任务设置类变量,java,android,interface,android-asynctask,Java,Android,Interface,Android Asynctask,如果你认为标题描述的问题不正确,请更正标题 我想通过实现的接口设置一个类变量,并将其返回给调用此函数的另一个类 这是代码。我使用AsyncTask和Interface的直接组合从onPostExecute返回对象: 我的问题是isLoggedIn始终保持为false,因为我使用AsyncTask查询数据库以检查用户是否登录。即使使用get方法,它也不起作用 异步任务的onPostExecute: 解决方案: 这是简化后的isUserLoggedIn: public void isUserLogg

如果你认为标题描述的问题不正确,请更正标题

我想通过实现的接口设置一个类变量,并将其返回给调用此函数的另一个类

这是代码。我使用AsyncTask和Interface的直接组合从onPostExecute返回对象:

我的问题是isLoggedIn始终保持为false,因为我使用AsyncTask查询数据库以检查用户是否登录。即使使用get方法,它也不起作用

异步任务的onPostExecute:

解决方案:

这是简化后的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();
}

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

在异步任务的后期执行中,如果登录为正,则按如下方式存储结果:

 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");
然后像这样读取变量:

 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");

设置上面的read-in-a-private方法来检查logIn是否返回布尔值isLoggedIn。

问题是isUserLoggedIn方法立即返回当前状态,但它在过程中启动了DbHandler。因此,isUserLoggedIn的调用方没有等待结果。修改活动代码以检查登录状态,因此将isUserLoggedIn修改为checkUserLoginStatus。在AsyncTask.onPostExecute中,需要将最新状态通知活动。这里要小心,因为您需要确保您的任务与活动的生命周期仔细协调。它不支持生命周期,因此,如果活动未处于运行状态,您试图直接操作UI组件,则可能会获得IllegalStateException。

因为异步任务尚未完成?是的,我知道。这就是我寻求帮助的原因…我将尝试根据您的答案重新编写代码。问题是我不想更改asynctask,因为它用于多个任务。如果您能提供一些代码,那就太好了examples@ManosKontakis试试这篇文章,看看它是否有助于理解异步任务并使用它:谢谢你,我会的!我是否必须将activity对象传递给AsyncTask以通知activity用户的状态?有几种不同的处理方法,例如直接使用activity、使用对它的WeakReference或使用回调接口。如果允许AsyncTask具有对活动的强引用,则可能导致内存泄漏。但是,如果您仔细协调w/onPause,则可以完成。
 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");