Question

I am trying to develop a RSS Reader application. But i am getting error, complete stack trace is given below.

01-14 21:18:54.262: E/AndroidRuntime(2541): FATAL EXCEPTION: main
01-14 21:18:54.262: E/AndroidRuntime(2541): java.lang.IllegalStateException: System services not available to Activities before onCreate()
01-14 21:18:54.262: E/AndroidRuntime(2541):     at android.app.Activity.getSystemService(Activity.java:4463)
01-14 21:18:54.262: E/AndroidRuntime(2541):     at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
01-14 21:18:54.262: E/AndroidRuntime(2541):     at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:153)
01-14 21:18:54.262: E/AndroidRuntime(2541):     at com.example.simplerssreader.SimpleRssReaderActivity.setData(SimpleRssReaderActivity.java:92)
01-14 21:18:54.262: E/AndroidRuntime(2541):     at com.example.simplerssreader.asyntask.AsynTaskRequest.onPostExecute(AsynTaskRequest.java:98)
01-14 21:18:54.262: E/AndroidRuntime(2541):     at com.example.simplerssreader.asyntask.AsynTaskRequest.onPostExecute(AsynTaskRequest.java:1)
01-14 21:18:54.262: E/AndroidRuntime(2541):     at android.os.AsyncTask.finish(AsyncTask.java:631)
01-14 21:18:54.262: E/AndroidRuntime(2541):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
01-14 21:18:54.262: E/AndroidRuntime(2541):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
01-14 21:18:54.262: E/AndroidRuntime(2541):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-14 21:18:54.262: E/AndroidRuntime(2541):     at android.os.Looper.loop(Looper.java:137)
01-14 21:18:54.262: E/AndroidRuntime(2541):     at android.app.ActivityThread.main(ActivityThread.java:5041)
01-14 21:18:54.262: E/AndroidRuntime(2541):     at java.lang.reflect.Method.invokeNative(Native Method)
01-14 21:18:54.262: E/AndroidRuntime(2541):     at java.lang.reflect.Method.invoke(Method.java:511)
01-14 21:18:54.262: E/AndroidRuntime(2541):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-14 21:18:54.262: E/AndroidRuntime(2541):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-14 21:18:54.262: E/AndroidRuntime(2541):     at dalvik.system.NativeStart.main(Native Method)

Here is my main activity

public class SimpleRssReaderActivity extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simple_rss_reader);
        new AsynTaskRequest().execute();        
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.simple_rss_reader, menu);
        return true;
    }
    public  void setData(){     
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, AsynTaskRequest.headLines);
        setListAdapter(adapter);        
    }

}

AsynTask Class Code

public class AsynTaskRequest extends AsyncTask<Void, Void, String>{ 
    public static List<String> headLines;
    public static List<String> links;
    SimpleRssReaderActivity smrssreader;    

    @Override
    protected String doInBackground(Void... params) {
        try {
            headLines = new ArrayList<String>();
             links    = new ArrayList<String>();
            URL url = new URL("http://gcuf.edu.pk/feed/");

            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(false);
            XmlPullParser xpp = factory.newPullParser();

                // We will get the XML from an input stream
            xpp.setInput(getInputStream(url), "UTF_8");         
            boolean insideItem = false;

            //Retruns the type of current event: START_TAG, END_TAG, etc..
            int eventType= xpp.getEventType();

            while (eventType != XmlPullParser.END_DOCUMENT) {

                if (eventType == XmlPullParser.START_TAG) {
                    if (xpp.getName().equalsIgnoreCase("item")) {
                        insideItem = true;                      
                    }else if (xpp.getName().equalsIgnoreCase("title")) {
                        if(insideItem){
                            headLines.add(xpp.nextText()); // Extract the headline
                        }                           
                    }else if (xpp.getName().equalsIgnoreCase("link")) {
                        if (insideItem) {
                            links.add(xpp.nextText()); // Extract the link of article
                        }
                    }
                }else if (eventType == XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("item")) {
                    insideItem = false;                 
                }
                eventType = xpp.next();
                }           
        } catch (MalformedURLException e) {
                e.printStackTrace();
        } catch (XmlPullParserException e){
            e.printStackTrace();            
        }catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public InputStream getInputStream (URL url){
        try {
            return url.openConnection().getInputStream();
        } catch (Exception e) {
            return null;
        }
    }

    @Override
    protected void onPostExecute(String result) {   
        super.onPostExecute(result);
        smrssreader = new SimpleRssReaderActivity();
        smrssreader.setData();

    }

}

No correct solution

OTHER TIPS

Your onPostExecute() is wrong. NEVER create an instance of the activity yourself, let alone via the constructor. Instead, your AsynTaskRequest needs to have some means of communicating back to its activity. It also needs to deal with the fact that the activity may change while this work is going on, due to the user rotating the screen or some other configuration change.

You could:

  • Use an event bus (LocalBroadcastManager, Otto, greenrobot's EventBus, etc.), and have onPostExecute() raise an event that the activity picks up when the work is done, or

  • Move the AsyncTask to be an inner class of a retained fragment, so the task works with the fragment in onPostExecute(), and the fragment knows the right activity to talk to, or

Other patterns exist, but those are two to start with.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top