导入包中的Android上下文问题

时间:2011-09-23 14:15:04

标签: java android

我有一个自己运行良好的推特包。现在,当我导入它并尝试在我的主应用程序中使用它时,我遇到了nullpointerexceptions的问题。第一个我解决了,但立即遇到了另一个。我现在相信这是因为我正在错误地处理上下文。

以下是我从包含的包中调用一个方法的方法。

        TweetToTwitterActivity twitter = new TweetToTwitterActivity();
        twitter.buttonLogin(v, context);

现在在TweetToTwitterActivity文件中,我有这个。第一种方法运行正常,但我现在从这一行得到一个空指针异常。我想我完全是错误的做法。任何人都可以帮我理解如何从导入的类中正确运行方法吗?

  

的setContentView(twitterSite);

public void buttonLogin(View v, Context context) {
    mPrefs = context.getSharedPreferences("twitterPrefs", MODE_PRIVATE);
    // Load the twitter4j helper
    mTwitter = new TwitterFactory().getInstance();

    // Tell twitter4j that we want to use it with our app
    mTwitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
    if (mPrefs.contains(PREF_ACCESS_TOKEN)) {
        Log.i(TAG, "Repeat User");
        loginAuthorisedUser();
    } else {
        Log.i(TAG, "New User");
        loginNewUser(context);
    }
}
private void loginNewUser(Context context) {

    try {
        Log.i(TAG, "Request App Authentication");
        mReqToken = mTwitter.getOAuthRequestToken(CALLBACK_URL);

        Log.i(TAG, "Starting Webview to login to twitter");
        WebView twitterSite = new WebView(context);
        twitterSite.requestFocus(View.FOCUS_DOWN);
        twitterSite.setOnTouchListener(new View.OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                    case MotionEvent.ACTION_UP:
                        if (!v.hasFocus()) {
                            v.requestFocus();
                        }
                        break;
                }
                return false;
            }
        });
        twitterSite.loadUrl(mReqToken.getAuthenticationURL());
        setContentView(twitterSite);

    } catch (TwitterException e) {
        Log.e("HelloWorld", "Error in activity", e);
        Toast.makeText(this, "Twitter Login error, try again later", Toast.LENGTH_SHORT).show();
    }
}

1 个答案:

答案 0 :(得分:0)

要显示网络视图, 确保TweetToTwitterActivity twitter是一个启动和活动的活动,否则它不能setContentView,因为它不受控制。这可以通过......等来完成。

TweetToTwitterActivity twitter = new TweetToTwitterActivity();
Intent intent = new Intent();
intent.setClass(context, TweetToTwitterActivity .class);
startActivity(intent);

然后,最好(可能需要)从twitter活动onCreate方法调用您的方法,而不是从创建活动的位置调用。

如评论所述,如果您不想实际显示网页视图,只是调用网页并分析结果,请不要使用网页视图,而是使用HttpPost(或者可能是HttpGet,具体取决于你正在做什么。)这是一个来自我有一个网络帖子的应用程序的例子,并查看结果而不是显示结果....

public static void checkWebSite() {
    HttpClient httpclient = getClient();
    HttpPost httppost = new HttpPost("http://yoursite.com/pathtopage");
    try {
                    //If you need to add name value params you can do that here...
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("name", "value"));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(httppost);
        String html = InputStreamToString(response.getEntity().getContent()).toString();

        //You can now analyze the html string for whatever you are looking for

    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
    } catch (IOException e) {
        // TODO Auto-generated catch block
    }

}