0

I am trying to learn how the POST method in Volley works but I keep getting the ClassCastException. I am trying Volley for the first time and have no idea what that means. I tried to google a little but havent figured it out yet. Any help is appreciated.

My code:

  package com.example.piyu004.volleycommunication;

  import android.app.Application;
  import android.support.v7.app.ActionBarActivity;
  import android.os.Bundle;
  import android.text.TextUtils;
  import android.view.Menu;
  import android.view.MenuItem;
  import android.widget.Toast;
  import com.android.volley.Request;
  import com.android.volley.RequestQueue;
  import com.android.volley.Response;
  import com.android.volley.VolleyError;
  import com.android.volley.VolleyLog;
  import com.android.volley.toolbox.JsonObjectRequest;
  import com.android.volley.toolbox.Volley;

  import org.json.JSONException;
  import org.json.JSONObject;

 import java.util.HashMap;


 public class MainActivity extends Application {


/**
 * Log or request TAG
 */
public static final String TAG = "VolleyPatterns";

/**
 * Global request queue for Volley
 */
private RequestQueue mRequestQueue;

/**
 * A singleton instance of the application class for easy access in other places
 */
private static MainActivity sInstance;

@Override
public void onCreate() {
    super.onCreate();
    tryPost();
    // initialize the singleton
    sInstance = this;
}

/**
 * @return ApplicationController singleton instance
 */
public static synchronized MainActivity getInstance() {
    return sInstance;
}

/**
 * @return The Volley Request queue, the queue will be created if it is null
 */
public RequestQueue getRequestQueue() {
    // lazy initialize the request queue, the queue instance will be
    // created when it is accessed for the first time
    if (mRequestQueue == null) {
        mRequestQueue = Volley.newRequestQueue(getApplicationContext());
    }

    return mRequestQueue;
}

/**
 * Adds the specified request to the global queue, if tag is specified
 * then it is used else Default TAG is used.
 *
 * @param req
 * @param tag
 */
public <T> void addToRequestQueue(Request<T> req, String tag) {
    // set the default tag if tag is empty
    req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);

    VolleyLog.d("Adding request to queue: %s", req.getUrl());

    getRequestQueue().add(req);
}

/**
 * Adds the specified request to the global queue using the Default TAG.
 *
 * @param req
 * @param
 */
public <T> void addToRequestQueue(Request<T> req) {
    // set the default tag if tag is empty
    req.setTag(TAG);

    getRequestQueue().add(req);
}

/**
 * Cancels all pending requests by the specified TAG, it is important
 * to specify a TAG so that the pending/ongoing requests can be cancelled.
 *
 * @param tag
 */
public void cancelPendingRequests(Object tag) {
    if (mRequestQueue != null) {
        mRequestQueue.cancelAll(tag);
    }
}
public void tryPost() {
    final String URL = "url address";
    // Post params to be sent to the server
    HashMap<String, String> params = new HashMap<String, String>();
    params.put("id", "7");

    params.put("address", "7");

    JsonObjectRequest req = new JsonObjectRequest(URL, new JSONObject(params),
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        VolleyLog.v("Response:%n %s", response.toString(4));
                        Toast.makeText(getApplicationContext(),"success",Toast.LENGTH_LONG).show();
                    } catch (JSONException e) {
                        Toast.makeText(getApplicationContext(),"error",Toast.LENGTH_LONG).show();
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.e("Error: ", error.getMessage());
        }
    });

    // add the request object to the queue to be executed
    MainActivity.getInstance().addToRequestQueue(req);
    }
   }

I am also pasting my logcat:

 05-08 17:02:15.173  20964-20964/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
 Process: com.example.piyu004.volleycommunication, PID: 20964
java.lang.RuntimeException: Unable to instantiate activity    ComponentInfo{com.example.piyu004.volleycommunication/com.example.piyu004.volley communication.MainActivity}: java.lang.ClassCastException:  com.example.piyu004.volleycommunication.MainActivity cannot be cast to  android.app.Activity
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2163)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2286)
        at android.app.ActivityThread.access$800(ActivityThread.java:144)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1246)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:212)
        at android.app.ActivityThread.main(ActivityThread.java:5135)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
        at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.ClassCastException: com.example.piyu004.volleycommunication.MainActivity cannot be cast to android.app.Activity
                 at    android.app.Instrumentation.newActivity(Instrumentation.java:1061)
                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2154)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2286)        at android.app.ActivityThread.access$800(ActivityThread.java:144)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1246)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:212)
   at android.app.ActivityThread.main(ActivityThread.java:5135)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:515)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
   at dalvik.system.NativeStart.main(Native Method)

Please let me know if you need any more information to help me

android.rookie
  • 171
  • 3
  • 14
  • Shouldn't `MainActivity`extend from `android.app.Activity` or any of its subclasses, instead of extending from `Application`? I think you are confusing what an Activity and an Application are – jmm May 09 '15 at 03:20
  • [This answer](http://stackoverflow.com/a/6775509/3923525) might help you – jmm May 09 '15 at 03:26
  • You have mixed Activity and Application class. Application is a Base class for those who need to maintain global application state. An activity is a single, focused thing that the user see. – Sharjeel May 09 '15 at 04:30
  • @jmm and sharj Thank you so much for your help. I was following a blog online. I guess that the code was incomplete. What I want to do is just use a POST method to upload data on my server. I will try following the code in your link. – android.rookie May 09 '15 at 05:39

1 Answers1

1

Subclass from Activity instead of Application.

Shubham A.
  • 2,446
  • 4
  • 36
  • 68