Android-在活动中执行异步任务
我有我的登录名。用户在EditText中键入用户名和密码,然后按一次单击登录按钮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();
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