【问题标题】:How to pass the context from an activity to an AsyncTask class to start a new Activity?如何将上下文从活动传递到 AsyncTask 类以启动新活动?
【发布时间】:2013-01-28 11:04:27
【问题描述】:

我正在尝试将 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();
            }
        }

意图永远不会被创建并且应用程序突然崩溃,因为上下文为空。我似乎找不到这个问题的解决方案。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    但是,如果您希望 Context 与用户凭据一起传递,请取出 无参数构造函数并更改剩余的构造函数,使其如下所示:

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

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

    【讨论】:

    • 啊。我明白。非常感谢!
    • @A--C 是否需要在构造函数或其他重写方法中使用AsyncTask 调用super()??
    • @donfede 不需要显式的 super() 调用,因为 Java 隐式添加了它。由于您覆盖的方法无论如何都是空的,调用super.method() 不应该做任何事情,所以应该没有任何需要。
    猜你喜欢
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 2010-11-10
    • 2017-06-14
    • 2019-06-14
    • 2018-06-10
    相关资源
    最近更新 更多