Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.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
Android-在活动中执行异步任务_Android_Android Asynctask_Static Methods - Fatal编程技术网

Android-在活动中执行异步任务

Android-在活动中执行异步任务,android,android-asynctask,static-methods,Android,Android Asynctask,Static Methods,我有我的登录名。用户在EditText中键入用户名和密码,然后按一次单击登录按钮 public void onClick(View v) { String username = ((EditText) findViewById(R.id.typeUsername)).getText().toString(); String password = ((EditText) findViewById(R.id.typePassword)).getText().toString();

我有我的登录名。用户在EditText中键入用户名和密码,然后按一次单击登录按钮

public void onClick(View v) {

    String username = ((EditText) findViewById(R.id.typeUsername)).getText().toString();
    String password = ((EditText) findViewById(R.id.typePassword)).getText().toString();
    Controller handler = new Controller(getBaseContext());


    if (!username.equals("") || !password.equals("")) {
        //new LoginTask().execute(((EditText)findViewById(R.id.typeUsername)).getText().toString(),
         //       ((EditText)findViewById(R.id.typePassword)).getText().toString());
       LoginTask load = new LoginTask(context);
       load.execute();
    } else {
        Toast.makeText(getApplicationContext(), "Please fill in all fields", Toast.LENGTH_SHORT).show();
        return;
    }
}
现在单击登录按钮时。它在同一个类中执行LoginTask

在LoginTask中,当单击login按钮时,将显示一个对话框,并在后台使用SQL检查用户输入。executeLog是我的DatabaseHelper中的一个方法,它是SQL的一个查询,用于检查用户名和密码是否匹配。saveLogin()是我的SharedReference类中的另一个方法,它将用户名和密码保存在SharedReference中


我的问题是如何执行?Login类中的LoginTask是否正确?我需要通过什么吗?我应该在LoginTask中使用什么来代替getApplicationContext

您的
LoginTask
声明为静态类,因此您没有访问
Login
实例的权限。尽管您试图访问
意图日志
成员。

您的
登录任务
声明为静态类,因此您没有访问
登录
实例的权限。尽管您试图访问
意图日志
成员。

LoginTask被声明为静态,并且无法访问外部环境。因此,无论是
Intent
日志还是
getApplicationContext()
都不能从
AsyncTask
中看到。还请注意,AsyncTask尝试访问未初始化的类成员。例如
控制器处理程序永远不会初始化。当执行
doInBackground
时,将导致
NPE

登录任务被声明为静态,并且无法访问外部环境。因此,无论是
Intent
日志还是
getApplicationContext()
都不能从
AsyncTask
中看到。还请注意,AsyncTask尝试访问未初始化的类成员。例如
控制器处理程序永远不会初始化。当执行
doInBackground
时,它将导致
NPE

异步任务中使用
上下文
引用的正确方法如下:

private static class ExampleTask extends AsyncTask<Void, Void, String> {

    private final WeakReference<Context> contextReference;

    private ExampleTask(Context context) {
        this.contextReference = new WeakReference<Context>(context);
    }

    @Override
    protected String doInBackground(Void... params) {
        final Context context = this.contextReference.get();
        if(context != null) {
            // Inside this if you can safely use the context variable
        }
        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);

        final Context context = this.contextReference.get();
        if(context != null) {
            // Inside this if you can safely use the context variable
        }
    }
}
私有静态类ExampleTask扩展了AsyncTask{
私有最终WeakReference contextReference;
私有示例任务(上下文){
this.contextReference=新的WeakReference(上下文);
}
@凌驾
受保护字符串doInBackground(无效…参数){
final Context Context=this.contextReference.get();
if(上下文!=null){
//如果您可以安全地使用上下文变量,则在该文件中
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串s){
super.onPostExecute(s);
final Context Context=this.contextReference.get();
if(上下文!=null){
//如果您可以安全地使用上下文变量,则在该文件中
}
}
}

WeakReference
的作用是允许垃圾收集器销毁
活动
上下文
,即使
AsyncTask
仍有对它的引用,从而防止内存泄漏的产生。如果要在
异步任务中使用
上下文
,需要调用
WeakReference
上的
get()。如果从
get()
获取的
上下文
不为空,则可以安全地使用它。

异步任务中使用
上下文
引用的正确方法如下:

private static class ExampleTask extends AsyncTask<Void, Void, String> {

    private final WeakReference<Context> contextReference;

    private ExampleTask(Context context) {
        this.contextReference = new WeakReference<Context>(context);
    }

    @Override
    protected String doInBackground(Void... params) {
        final Context context = this.contextReference.get();
        if(context != null) {
            // Inside this if you can safely use the context variable
        }
        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);

        final Context context = this.contextReference.get();
        if(context != null) {
            // Inside this if you can safely use the context variable
        }
    }
}
私有静态类ExampleTask扩展了AsyncTask{
私有最终WeakReference contextReference;
私有示例任务(上下文){
this.contextReference=新的WeakReference(上下文);
}
@凌驾
受保护字符串doInBackground(无效…参数){
final Context Context=this.contextReference.get();
if(上下文!=null){
//如果您可以安全地使用上下文变量,则在该文件中
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串s){
super.onPostExecute(s);
final Context Context=this.contextReference.get();
if(上下文!=null){
//如果您可以安全地使用上下文变量,则在该文件中
}
}
}

WeakReference
的作用是允许垃圾收集器销毁
活动
上下文
,即使
AsyncTask
仍有对它的引用,从而防止内存泄漏的产生。如果要在
异步任务中使用
上下文
,需要调用
WeakReference
上的
get()。如果从
get()
获取的
Context
不为空,您可以安全地使用它。

我是Java编程新手,如何调用intent来启动我的MIAIN活动我是Java编程新手,如何调用intent来启动我的MIAIN活动如何解决这个问题?对不起,我是Java新手。我是否也初始化了在LoginTask中执行代码所需的所有数据库控制器和类的instance?如何解决这个问题?对不起,我是Java新手。我是否也初始化了所有数据库控制器和类的instance,以将代码执行到LoginTask中?是的。如果你没有删除你以前的帖子,我会向你解释一切,但当我试图发布我的答案时,你已经删除了这个问题。。。不要多次发布同一个问题。这是高度不赞成的。。。总结:您不能在任务中使用
上下文
引用。这正是造成内存泄漏的原因。@XaverKapeller我为此道歉。我是Java新手。如何解决我的问题以正确传递代码数据?如果您确实需要在t中引用
上下文
活动
,请使用
WeakReference