1

I'm trying to code a tweeter feed but i have an error for the compilation.

I don't forget to add my activity into the manifest.

Here is the activity code :

package fr.enstb.tp2;

import java.net.URL;
import java.util.ArrayList;

import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class TweetsActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ArrayList<Tweet> tweets = getTweets("android", 1);

        ListView listView = (ListView) findViewById(R.id.ListViewId);
        listView.setAdapter(new UserItemAdapter(this, R.layout.tweets_layout, tweets));
    }

    public class UserItemAdapter extends ArrayAdapter<Tweet> {
        private ArrayList<Tweet> tweets;

        public UserItemAdapter(Context context, int textViewResourceId, ArrayList<Tweet> tweets) {
            super(context, textViewResourceId, tweets);
            this.tweets = tweets;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;
            if (v == null) {
                LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.tweets_layout, null);
            }

            Tweet tweet = tweets.get(position);
            if (tweet != null) {
                TextView username = (TextView) v.findViewById(R.id.username);
                TextView message = (TextView) v.findViewById(R.id.message);
                ImageView image = (ImageView) v.findViewById(R.id.avatar);

                if (username != null) {
                    username.setText(tweet.username);
                }

                if(message != null) {
                    message.setText(tweet.message);
                }

                if(image != null) {
                    image.setImageBitmap(getBitmap(tweet.image_url));
                }
            }
            return v;
        }
    }

    public Bitmap getBitmap(String bitmapUrl) {
        try {
            URL url = new URL(bitmapUrl);
            return BitmapFactory.decodeStream(url.openConnection() .getInputStream()); 
        }
        catch(Exception ex) {return null;}
    }

    public ArrayList<Tweet> getTweets(String searchTerm, int page) {
        String searchUrl = "http://search.twitter.com/search.json?q=@" 
                            + searchTerm + "&rpp=100&page=" + page;

        ArrayList<Tweet> tweets = new ArrayList<Tweet>();

        HttpClient client = new  DefaultHttpClient();
        HttpGet get = new HttpGet(searchUrl);

        ResponseHandler<String> responseHandler = new BasicResponseHandler();

        String responseBody = null;
        try{
            responseBody = client.execute(get, responseHandler);
        }catch(Exception ex) {
            ex.printStackTrace();
        }

        JSONObject jsonObject = null;
        JSONParser parser=new JSONParser();

        try {
            Object obj = parser.parse(responseBody);
            jsonObject=(JSONObject)obj;

        }catch(Exception ex){
            Log.v("TEST","Exception: " + ex.getMessage());
        }

        JSONArray arr = null;

        try {
            Object j = jsonObject.get("results");
            arr = (JSONArray)j;
        }catch(Exception ex){
            Log.v("TEST","Exception: " + ex.getMessage());
        }

        for(Object t : arr) {
            Tweet tweet = new Tweet(
                    ((JSONObject)t).get("from_user").toString(),
                    ((JSONObject)t).get("text").toString(),
                    ((JSONObject)t).get("profile_image_url").toString()
                    );
            tweets.add(tweet);
        }

        return tweets;
    }

    public class Tweet {
        public String username;
        public String message;
        public String image_url;

        public Tweet(String username, String message, String url) {
            this.username = username;
            this.message = message;
            this.image_url = url;
        }
    }
}

And here is the log traces :

: E/AndroidRuntime(884): FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{fr.enstb.tp2/fr.enstb.tp2.TweetsActivity}: java.lang.NullPointerException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
    at android.app.ActivityThread.startActivityNow(ActivityThread.java:1796)
    at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)
    at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347)
    at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:682)
    at android.widget.TabHost.setCurrentTab(TabHost.java:346)
    at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:150)
    at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:540)
    at android.view.View.performClick(View.java:3460)
    at android.view.View$PerformClick.run(View.java:13955)
    at android.os.Handler.handleCallback(Handler.java:605)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4340)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.NullPointerException
    at fr.enstb.tp2.TweetsActivity.getTweets(TweetsActivity.java:126)
    at fr.enstb.tp2.TweetsActivity.onCreate(TweetsActivity.java:36)
    at android.app.Activity.performCreate(Activity.java:4465)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
    ... 18 more

Thankk for your help !

1 Answer 1

1

According to the stacktrace, your arr variable in getTweets() must be null since you get a NullPointerException on this line: for(Object t : arr)

Step through the code with the debugger and see what you get back from the service call.

Sign up to request clarification or add additional context in comments.

1 Comment

In fact there is a problem at this line : Object j = jsonObject.get("results"); arr = (JSONArray)j; }catch(Exception ex){ The exception is thrown just after the first line. I don't understand why.. With the debugger, i look also that the variable respondeBody is null.. I have tried to test my query directly to a browser, it works ! Any other idea?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.