0

I have a json file which contains a large size of data such as place id, latitude, longitude and date. I want to pass this data from one activity to another. When I am doing this same with Intent the app shows error. How to pass data using a database? I have to pull json file from server.When i pull data, i want to create a database table and pass data to another activity.

public class ExampleActivity extends AppCompatActivity {

    EditText collDate;
    Button pullGPSData;
    SharedPreferences shp;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_track_example);

        collDate = findViewById(R.id.collection_date);
        pullGPSData = findViewById(R.id.pull_track_data);

       
    }

    public void listeners(View view) {

        switch (view.getId()) {

            case R.id.pull_track_data: {

                try {
                    String collectionDateString = collectionDate.getText().toString();
                    GPSDetail gpsDetail = new GPSDetail();

                    SharedPreferences shp = getSharedPreferences(Const.Shared_Pref_name, MODE_PRIVATE);
                    DbHelper dbHelper = new DbHelper(this);


                    Calendar cal = Calendar.getInstance();
                    Date todayDate = cal.getTime();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    String todayDateString = sdf.format(todayDate);

                    if ( !todayDateString.equals(collectionDateString)) {
                        JSONObject jsonObjectKeyValue = new JSONObject();

                        jsonObjectKeyValue.put("keyValue", Const.AUTH_KEY_VALUE);


                        JSONArray jsonArray = new JSONArray();
                        jsonArray.put(jsonObjectKeyValue);

                        JSONObject jsonObject = new JSONObject();
                        jsonObject.put("AuthKey", jsonArray);
                        jsonObject.put("EmployeeCode",shp.getString(Const.Shp_Agent_Id,""));
                        jsonObject.put("FromDate", collectionDateString);


                        JSONObject gpsDetailsObj = new JSONObject();
                        gpsDetailsObj.put("gpstrackdetails", jsonObject);
                        Log.d("LogGPSTrack Details",gpsDetailsObj.toString());

                        new PullGPSTrackDetailsTask(this, gpsDetailsObj).execute();
                    }

                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }
            break;
        }
    }

    private static class PullGPSTrackDetailsTask extends AsyncTask<String, String, String> {

        WeakReference<ExampleActivity> context;
        Dialog pd;
        OkHttpClient okHttpClient;
        String url;
        Request request;
        MediaType JSON = MediaType.parse("application/json; charset=utf-8");
        List<GPSDetail> gpsDetailList;
    
        DbHelper dbHelper;
        JSONObject jsonObject;
        JSONObject resultJson;
        String resultString;



        public PullGPSTrackDetailsTask(ExampleActivity contextObj, JSONObject gpsDetailsObj) {
            this.context = new WeakReference<>(contextObj);
            this.jsonObject = gpsDetailsObj;
            okHttpClient = new OkHttpClient.Builder()
                         .connectTimeout(180,TimeUnit.SECONDS)
                          .readTimeout(180,TimeUnit.SECONDS)
                          .callTimeout(180,TimeUnit.SECONDS)
                          .build();


            // pd = Fns.getProgressDialogLottie(context.get());
            pd = new ProgressDialog(contextObj);
            pd.setTitle("Please Wait");
            pd.setCancelable(false);

        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pd.show();

        }

        @Override
        protected String doInBackground(String... strings) {

            try {

                url = USING_IP + URL_GET_GPS;

                request = new Request.Builder()
                        //.header("X-Client-Type", "Android")
                        .url(url)
                        .post(body)
                        .build();
                
                Response response = okHttpClient.newCall(request).execute();
                

                if (!response.isSuccessful()) {

                    return "failure";

                }

                resultString = response.body().string();
                Log.e("LogresultString", resultString); // 



            } catch (Exception e) {
                Log.e("Log", "Exception", e);
                return "failure";
            }

            return "success";
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);

            pd.dismiss();
            if (s.equals("success")) {

                Intent intent = new Intent(context.get(), ExampleSecondActivity.class);
                intent.putExtra("value", resultString);
                context.get().startActivity(intent);
                Log.d("LogIntent",String.valueOf(intent));


            } else if (s.equals("failure")) {

                Toast.makeText(context.get(), "Pull Failed", Toast.LENGTH_LONG).show();

               
            }

        }

    }

}


My json

{
    "GPS Track Details": [
        {
            "id": 1280,
          
            "Longitude": -122.084,
            "Latitude": 37.422,
            "Date": "2020-08-21"
        },
        {
            "id": 1232,
            "Longitude": -121.023,
            "Latitude": 37.302,
            "Date": "2020-08-21"
        },
        {
            "id": 1213,
            "Longitude": -121.037,
            "Latitude": 37.300,
            "Date": "2020-08-21"
        },
        {
            "id": 1226,
            "Longitude": -120.098,
            "Latitude": 37.422,
            "Date": "2020-08-21"
        },
.....
.....
        ]
}

My Logcat

E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!  (parcel size = 5834308)
D/AndroidRuntime: Shutting down VM
E/CustomActivityOnCrash: App has crashed, executing CustomActivityOnCrash's UncaughtExceptionHandler
    java.lang.RuntimeException: Failure from system
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1525)
        at android.app.Activity.startActivityForResult(Activity.java:4224)
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:676)
        at android.app.Activity.startActivityForResult(Activity.java:4183)
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:663)
        at android.app.Activity.startActivity(Activity.java:4507)
        at android.app.Activity.startActivity(Activity.java:4475)
        at android.os.AsyncTask.finish(AsyncTask.java:660)
        at android.os.AsyncTask.-wrap1(AsyncTask.java)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:677)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6077)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
     Caused by: android.os.TransactionTooLargeException: data parcel size 5834308 bytes
        at android.os.BinderProxy.transactNative(Native Method)
        at android.os.BinderProxy.transact(Binder.java:615)
        at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3070)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1518)
        at android.app.Activity.startActivityForResult(Activity.java:4224) 
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:676) 
        at android.app.Activity.startActivityForResult(Activity.java:4183) 
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:663) 
        at android.app.Activity.startActivity(Activity.java:4507) 
        at android.app.Activity.startActivity(Activity.java:4475) 
        at android.os.AsyncTask.finish(AsyncTask.java:660) 
        at android.os.AsyncTask.-wrap1(AsyncTask.java) 
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:677) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6077) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 

1 Answers1

1

There is a limit of 1 MB for Transaction in android. You have to do some work around to pass the data. These are some solutions you can try.

Solution 1

Save the data into a public static variable member and then access it from second activity.

Solution 2

Split your data into small chunks and pass it via bundle from intent.

Solution 3

Use shared preferences, store json data in shared prefs and access it whenever needed from shared prefs.

Solution 4 (If data is really huge)

Save it to disk and not transfer it at all, then directly access it from disk.

Ankit Suda
  • 128
  • 2
  • 9