在实例方法中调用startActivity() - 导致NullPointerException

时间:2011-03-17 21:40:12

标签: android android-internet

Heya - 我试图从一个在onPostExecute()中扩展AsyncTask的类调用startActivity()。

这是流程:

扩展AsyncTask的类:

protected void onPostExecute() {
    Login login = new Login();
    login.pushCreateNewOrChooseExistingFormActivity();
}

扩展活动的类:

public void pushCreateNewOrChooseExistingFormActivity() {
    // start the CreateNewOrChooseExistingForm Activity
    Intent intent = new Intent(Intent.ACTION_VIEW);
    **ERROR_HERE*** intent.setClassName(this, CreateNewOrChooseExistingForm.class.getName());
    startActivity(intent);
}

我每次都会收到此错误:

03-17 16:04:29.579: ERROR/AndroidRuntime(1503): FATAL EXCEPTION: main
03-17 16:04:29.579: ERROR/AndroidRuntime(1503): java.lang.NullPointerException
03-17 16:04:29.579: ERROR/AndroidRuntime(1503): at android.content.ContextWrapper.getPackageName(ContextWrapper.java:120)
03-17 16:04:29.579: ERROR/AndroidRuntime(1503): at android.content.ComponentName.(ComponentName.java:62)
03-17 16:04:29.579: ERROR/AndroidRuntime(1503): at android.content.Intent.setClassName(Intent.java:4850)
03-17 16:04:29.579: ERROR/AndroidRuntime(1503): at com.att.AppName.Login.pushCreateNewOrChooseExistingFormActivity(Login.java:47)

对于iOS开发人员 - 我只是想将一个新的视图控制器推送到导航控制器的堆栈la pushViewController:animated:。显然 - 在这个平台上很难做到。

有什么想法吗?提前谢谢!

更新 - 修正:

根据@Falmarri的建议,我设法解决了这个问题。

首先,我不再调用Login login = new Login();来创建新的登录对象。坏。坏。坏。没有cookie。

相反,在准备调用.execute()时,本教程(appfulcrum.com/?p=126)建议将applicationContext传递给执行AsyncTask的类,以实现我的目的,如下所示:

    CallWebServiceTask task = new CallWebServiceTask();
    // pass the login object to the task
    task.applicationContext = login;
    // execute the task in the background, passing the required params
    task.execute(login);

现在,在onPostExecute()中,我可以使用这样的Login对象方法:

        ((Login) applicationContext).pushCreateNewOrChooseExistingFormActivity();
        ((Login) applicationContext).showLoginFailedAlert(result.get("httpResponseCode").toString());
        ...

希望这可以帮助其他人!特别是iOS开发人员转向Android ...

1 个答案:

答案 0 :(得分:5)

如果Login是一个扩展Activity的类,那么您永远不应该自己创建一个新的Login对象,例如

Login login = new Login();

这是非常非常错误的,您应该回过头来阅读一些Android教程。