android - 如何将上下文从 Activity 传递到 AsyncTask 类以启动新 Activity?

标签 android android-intent android-asynctask android-context

我正在尝试将上下文从 Activity 传递到 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;
}

在我的 Activity 中,当我单击按钮时,我有以下代码:

 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 从未创建,应用程序突然崩溃,因为上下文为空。我似乎找不到这个问题的解决方案。

最佳答案

为了实现最小代码更改,请保留对 LoginTask 的引用,而不是创建两个单独实例:

LoginService l = new LoginService(editTextUsername.getText().toString(), editTextPassword.getText().toString());

l.setContext (getApplicationContext());

l.execute();

您的代码每次都会创建一个新的 LoginTask,并且由于您有两个单独的构造函数,因此 context 始终为 null(第二个构造函数不保存上下文,因为您创建了一个单独的对象!)

但是,如果您希望 Context 与用户信用一起传递,请取出无参数构造函数并更改剩余的构造函数,使其看起来像这样:

public LoginService(Context context,String username, String password){
    this.context = context;
    this.username=username;
    this.password=password;
}

拥有不执行任何操作的空构造函数通常是没有意义的,因此请调整有用的构造函数,使其更加有用。

关于android - 如何将上下文从 Activity 传递到 AsyncTask 类以启动新 Activity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14844443/

相关文章:

android - 为什么我使用 AsyncTask 时会出现 android.os.NetworkOnMainThreadException?

java - 数据没有通过android应用程序插入mysql数据库

android - 致命异常:AsyncTask#1使用JSON导致后台错误

处理方向更改后的 Android GridView 反转

android - android OpenCV-2.3.0 eclipse

java - 返回 Activity 的 fragment

android - 崩溃后开始 Activity

Android - Intent 以某种方式增加?

Android gradle库项目: package extra modules and jars

android - 使用 showInfoWindow 时如何在 Google Maps v2 上显示路线图标?