我正在尝试将Context从一个活动传递给AsyncTask类。问题是上下文为空。
在我的AsyncTask类中,我有以下
public class LoginService extends AsyncTask<String, Void, String> {
....
public Context context;
public LoginService(){
}
public LoginService(String username, String password){
this.username=username;
this.password=password;
}
@Override
protected String doInBackground(String... params) {
String userID = login(username, password);
return userID;
}
protected void onPostExecute(String result){
loginSuccess = result;
if (loginSuccess!=fail){
Intent casesActivity = new Intent(context, CasesActivity.class);
casesActivity.putExtra("username", result);
context.startActivity(casesActivity);
}
public void setContext(Context newContext){
context = newContext;
}
在我的活动中,当我点击一个按钮时,我有以下代码:
public void onClick(View view) {
if ((editTextPassword.getText().toString() != null & editTextUsername.getText().toString() != null)){
new LoginService().setContext(getApplicationContext());
new LoginService(editTextUsername.getText().toString(), editTextPassword.getText().toString()).execute();
}
else{
//Display Toaster for error
Toast.makeText(getApplicationContext(),"Please enter your details", Toast.LENGTH_LONG).show();
}
}
永远不会创建intent,并且应用程序突然崩溃,因为上下文为null。我似乎找不到解决这个问题的方法。
答案 0 :(得分:3)
对于最小代码更改,请保留对LoginTask
的引用,而不是创建两个单独的实例:
LoginService l = new LoginService(editTextUsername.getText().toString(), editTextPassword.getText().toString());
l.setContext (getApplicationContext());
l.execute();
您的代码每次都会创建一个新的LoginTask
,并且由于您有两个单独的构造函数,context
始终为null(第二个构造函数不保存上下文,因为您创建了一个单独的Object! )
但是,如果您希望将Context与用户信用一起传递,请将 out 与无参数构造函数相对应,并更改剩余的构造函数,使其看起来像:
public LoginService(Context context,String username, String password){
this.context = context;
this.username=username;
this.password=password;
}
拥有无效的空构造函数通常毫无意义,因此请调整有用的构造函数,使其甚至 more 有用。