Conor Bradley
Conor Bradley

Reputation: 145

Getting data from Parse.com using fragments

I am trying to pull data from parse.com and place the resulting in a ListView.

The code itself has no errors however when i run it, it crashes and i have no idea why.

LogCat suggests the bug is in the 'doInBackground' method however i have not been able to find a way to solve this.

i feel there is a simple solution to this.

thanks for any help :)

Fragment class:

public class fragname extends Fragment { 

// Declare Variables
ListView listview;
List<ParseObject> ob;
ProgressDialog mProgressDialog;
ArrayAdapter<String> adapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) {
    // inflat and return the layout
    View v = inflater.inflate(R.layout.listview_main, container, false);

    new RemoteDataTask().execute();


    return v;
}

private class RemoteDataTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Create a progressdialog
        mProgressDialog = new ProgressDialog(getActivity());
        // Set progressdialog title
        mProgressDialog.setTitle("Loading Programme, Please Wait :)");
        // Set progressdialog message
        mProgressDialog.setIndeterminate(false);
        // Show progressdialog
        mProgressDialog.show();

    }

    @Override
    protected Void doInBackground(Void... params) {
        ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(
                "Country");
        query.orderByDescending("country");

            try {
                ob = query.find();
            } catch (com.parse.ParseException e) {
Toast.makeText(getActivity(), "Error, " +     e.getMessage(), Toast.LENGTH_LONG).show();
                e.printStackTrace();
            }

        return null;            
    }}

protected void onPostExecute(Void result){

    listview = (ListView) getView().findViewById(R.id.listview);        
    adapter = new ArrayAdapter<String>(getActivity(), R.layout.listview_item);      
    for (ParseObject country : ob) {
        adapter.add((String) country.get("country"));
    }       
    listview.setAdapter(adapter);       
    mProgressDialog.dismiss();  
}

listview_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<ListView
    android:id="@+id/listview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

</RelativeLayout>

listview.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5sp"
android:textSize="25sp" >

</TextView>

LogCat:

12-03 16:13:30.380: D/dalvikvm(10654): GC_CONCURRENT freed 7646K, 53% free 6933K/14663K,           paused 2ms+6ms
12-03 16:13:30.380: E/AndroidRuntime(10654): FATAL EXCEPTION: AsyncTask #1
12-03 16:13:30.380: E/AndroidRuntime(10654): java.lang.RuntimeException: An error occured                                                                    while executing doInBackground()
12-03 16:13:30.380: E/AndroidRuntime(10654):    at     android.os.AsyncTask$3.done(AsyncTask.java:278)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at    java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at    java.util.concurrent.FutureTask.setException(FutureTask.java:124)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at    java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at java.lang.Thread.run(Thread.java:856)
12-03 16:13:30.380: E/AndroidRuntime(10654): Caused by: java.lang.RuntimeException: You must call Parse.initialize(context, oauthKey, oauthSecret) before using the Parse library.
12-03 16:13:30.380: E/AndroidRuntime(10654):    at com.parse.ParseUser.checkApplicationContext(ParseUser.java:853)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at com.parse.ParseUser.getCurrentUser(ParseUser.java:726)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at com.parse.ParseUser.getCurrentSessionToken(ParseUser.java:756)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at com.parse.ParseQuery.findFromNetworkAsync(ParseQuery.java:511)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at com.parse.ParseQuery.access$4(ParseQuery.java:510)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at com.parse.ParseQuery$5.runOnNetworkAsync(ParseQuery.java:455)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at com.parse.ParseQuery.runCommandWithPolicyAsync(ParseQuery.java:397)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at com.parse.ParseQuery.findWithCachePolicyAsync(ParseQuery.java:466)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at com.parse.ParseQuery.findAsync(ParseQuery.java:449)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at com.parse.ParseQuery.find(ParseQuery.java:489)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at info.androidhive.slidingmenu.FindPeopleFragment$RemoteDataTask.doInBackground(FindPeopleFragme  nt.java:66)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at info.androidhive.slidingmenu.FindPeopleFragment$RemoteDataTask.doInBackground(FindPeopleFragment.java:1)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
12-03 16:13:30.380: E/AndroidRuntime(10654):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-03 16:13:30.380: E/AndroidRuntime(10654):    ... 5 more
12-03 16:13:30.870: D/OpenGLRenderer(10654): Flushing caches (mode 0)
12-03 16:13:30.880: D/OpenGLRenderer(10654): Flushing caches (mode 0)
12-03 16:13:31.390: D/OpenGLRenderer(10654): Flushing caches (mode 1)
12-03 16:13:31.400: E/WindowManager(10654): Activity  info.androidhive.slidingmenu.MainActivity has leaked window  com.android.internal.policy.impl.PhoneWindow$DecorView@41874b28 that was originally added here
12-03 16:13:31.400: E/WindowManager(10654): android.view.WindowLeaked: Activity    info.androidhive.slidingmenu.MainActivity has leaked window   com.android.internal.policy.impl.PhoneWindow$DecorView@41874b28 that was originally added here
12-03 16:13:31.400: E/WindowManager(10654):     at android.view.ViewRootImpl.<init>(ViewRootImpl.java:344)
12-03 16:13:31.400: E/WindowManager(10654):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267)
12-03 16:13:31.400: E/WindowManager(10654):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
12-03 16:13:31.400: E/WindowManager(10654):     at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
12-03 16:13:31.400: E/WindowManager(10654):     at android.view.Window$LocalWindowManager.addView(Window.java:537)
12-03 16:13:31.400: E/WindowManager(10654):     at android.app.Dialog.show(Dialog.java:278)
12-03 16:13:31.400: E/WindowManager(10654):     at info.androidhive.slidingmenu.FindPeopleFragment$RemoteDataTask.onPreExecute(FindPeopleFragment.java:53)
12-03 16:13:31.400: E/WindowManager(10654):     at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:561)
12-03 16:13:31.400: E/WindowManager(10654):     at android.os.AsyncTask.execute(AsyncTask.java:511)
12-03 16:13:31.400: E/WindowManager(10654):     at info.androidhive.slidingmenu.FindPeopleFragment.onCreateView(FindPeopleFragment.java:35)
12-03 16:13:31.400: E/WindowManager(10654):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:828)
12-03 16:13:31.400: E/WindowManager(10654):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1032)
12-03 16:13:31.400: E/WindowManager(10654):     at android.app.BackStackRecord.run(BackStackRecord.java:622)
 12-03 16:13:31.400: E/WindowManager(10654):    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1382)
12-03 16:13:31.400: E/WindowManager(10654):     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426)
12-03 16:13:31.400: E/WindowManager(10654):     at android.os.Handler.handleCallback(Handler.java:605)
12-03 16:13:31.400: E/WindowManager(10654):     at android.os.Handler.dispatchMessage(Handler.java:92)
12-03 16:13:31.400: E/WindowManager(10654):     at android.os.Looper.loop(Looper.java:137)
12-03 16:13:31.400: E/WindowManager(10654):     at android.app.ActivityThread.main(ActivityThread.java:4446)
12-03 16:13:31.400: E/WindowManager(10654):     at java.lang.reflect.Method.invokeNative(Native Method)
12-03 16:13:31.400: E/WindowManager(10654):     at java.lang.reflect.Method.invoke(Method.java:511)
12-03 16:13:31.400: E/WindowManager(10654):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-03 16:13:31.400: E/WindowManager(10654):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-03 16:13:31.400: E/WindowManager(10654):     at dalvik.system.NativeStart.main(Native Method)
12-03 16:13:32.360: I/Process(10654): Sending signal. PID: 10654 SIG: 9

Edit

Parse Application class

public class ParseApplication extends Application {

@Override
public void onCreate() {
    super.onCreate();

    // Add your initialization code here
    Parse.initialize(this, "**parse key**","**parse key**");

    ParseUser.enableAutomaticUser();
    ParseACL defaultACL = new ParseACL();

    // If you would like all objects to be private by default, remove this
    // line.
    defaultACL.setPublicReadAccess(true);

    ParseACL.setDefaultACL(defaultACL, true);
}

}

Upvotes: 2

Views: 3378

Answers (1)

Michael Evans
Michael Evans

Reputation: 495

You need to call Parse.initialize(context, oauthKey, oauthSecret) in your application before you make any queries to Parse. This tells the service which app is yours. You can find the keys on your Parse Dashboard.

This blog post might be helpful: http://www.michaelevans.org/blog/2013/08/14/tutorial-building-an-android-to-do-list-app-using-parse/

Upvotes: 1

Related Questions