Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack trace available

I am trying to compare values of lat long provided by user with values of lat long from database. If they are in 15 km radius of each other textview should be changed. But i am facing following error,

My database contains value source lat = 19.218418 source long = 73.08661 Des lat = 18.9766017 des long = 72.8326658. and values provided by user are soure lat = 19.2213935 source long= 73.081532 des lat = 18.9632933 des long = 72.8324848.

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.hitesh.nearby, PID: 2156
              java.lang.IllegalStateException: Could not execute method for android:onClick
                  at android.view.View$DeclaredOnClickListener.onClick(View.java:5347)
                  at android.view.View.performClick(View.java:6267)
                  at android.view.View$PerformClick.run(View.java:24763)
                  at android.os.Handler.handleCallback(Handler.java:789)
                  at android.os.Handler.dispatchMessage(Handler.java:98)
                  at android.os.Looper.loop(Looper.java:164)
                  at android.app.ActivityThread.main(ActivityThread.java:6548)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
               Caused by: java.lang.reflect.InvocationTargetException
                  at java.lang.reflect.Method.invoke(Native Method)
                  at android.view.View$DeclaredOnClickListener.onClick(View.java:5342)
                  at android.view.View.performClick(View.java:6267) 
                  at android.view.View$PerformClick.run(View.java:24763) 
                  at android.os.Handler.handleCallback(Handler.java:789) 
                  at android.os.Handler.dispatchMessage(Handler.java:98) 
                  at android.os.Looper.loop(Looper.java:164) 
                  at android.app.ActivityThread.main(ActivityThread.java:6548) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
               Caused by: java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack trace available

Result.java

public class result extends Activity {
DatabaseHelper myDb;

@Override
protected void onCreate(Bundle savedInstanceState) {
    myDb = new DatabaseHelper(this);

    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_result);
    String url = getIntent().getExtras().getString("username");
    String url1 = getIntent().getExtras().getString("username1");
    TextView tv= (TextView)findViewById(R.id.textView2);
    TextView tv1= (TextView)findViewById(R.id.textView5);


    String[] separated = url.split("_");
    String srclat = separated[0];
        Double dsrclat= Double.parseDouble(srclat);
    String srclng = separated[1];
        Double dsrclng= Double.parseDouble(srclng);

    String[] separated1 = url.split("_");
    String deslat = separated1[0];
         Double ddeslat= Double.parseDouble(deslat);
    String deslng = separated1[1];
         Double ddeslng= Double.parseDouble(deslng);

    tv.setText(url);
    tv1.setText(url1);

}

public void Database(View view){
    Intent intent = new Intent(result.this, feeder.class);
    startActivity(intent);
}


public void NearestValue(View view){


    TextView tv= (TextView)findViewById(R.id.textView2);
    String s1 = tv.getText().toString();
    String[] separated = s1.split("_");
    String deslat = separated[0];
    Double Lat= Double.parseDouble(deslat);
    String deslng = separated[1];
    Double Lng= Double.parseDouble(deslng);
    ArrayList<String> ssList = new ArrayList<>();
    ssList = myDb.countDatabase(Lat,Lng);
    int ssize = ssList.size();
    TextView tvvv = (TextView) findViewById(R.id.textView8);
    for(int i=0;i<ssize;i++) {
        tvvv.setText(ssList.get(i));
    }

    TextView tv1= (TextView)findViewById(R.id.textView5);
    String s11 = tv1.getText().toString();
    String[] separated1 = s11.split("_");
    String deslat1 = separated1[0];
    Double Lat1= Double.parseDouble(deslat1);
    String deslng1 = separated1[1];
    Double Lng1= Double.parseDouble(deslng1);
    ArrayList<String> ddList = new ArrayList<>();
    ddList = myDb.countDatabase1(Lat1,Lng1);
    int dsize = ddList.size();
    TextView tvvvv = (TextView) findViewById(R.id.textView9);
    for(int i=0;i<dsize;i++) {
        tvvv.setText(ddList.get(i));
    }

        for(int i=0;i<ssize;i++){
            String source = ssList.get(i);
            for(int j=0;j<dsize;j++) {
                String destination = ddList.get(j);
                String src = myDb.findBus(source, destination);

                    TextView tvv = (TextView) findViewById(R.id.textView7);
                    tvv.setText(src);

            }

        }

    }

}

DatabaseHelper

    public class DatabaseHelper extends SQLiteOpenHelper {
    public static final String DATABASE_NAME = "Nearby.db";
    public static final String TABLE_NAME = "halt_details";
    public static final String COL_2 = "snme";
    public static final String COL_3 = "slati";
    public static final String COL_4 = "slong";
    public static final String COL_5 = "dnme";
    public static final String COL_6 = "dlati";
    public static final String COL_7 = "dlong";
    public static final String COL_8 = "buses";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, snme VARCHAR, slati DOUBLE, slong DOUBLE, dnme VARCHAR, dlati DOUBLE, dlong DOUBLE, buses VARCHAR)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }

    public void insertData(String sname, Double slat, Double slng, String dname, Double dlat, Double dlng, String bus) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put("snme",sname);
        contentValues.put("slati",slat);
        contentValues.put("slong",slng);
        contentValues.put("dnme",dname);
        contentValues.put("dlati",dlat);
        contentValues.put("dlong",dlng);
        contentValues.put("buses",bus);

        db.insert(TABLE_NAME,null ,contentValues);
    }

    public void clearDatabase() {
        SQLiteDatabase db = this.getWritableDatabase();
        String clearDBQuery = "DELETE FROM "+TABLE_NAME;
        db.execSQL(clearDBQuery);
    }

    public ArrayList<String> countDatabase(Double LAT, Double LNG) {
        String sourcename=null;
        double earthRadius = 6371.75;
        ArrayList<String> sList = new ArrayList<>();
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor mCount= db.rawQuery("SELECT * FROM " + DatabaseHelper.TABLE_NAME + " WHERE " + DatabaseHelper.COL_3 + " BETWEEN (" +LAT+"- 0.1) AND ("+LAT+" + 0.1) AND " + DatabaseHelper.COL_4 + " BETWEEN (" +LNG+"- 0.1) AND ("+LNG+" + 0.1)", null);
        mCount.moveToNext();
        while (mCount.moveToFirst()) {
            double Latitude = mCount.getDouble(2);
            double Longitude = mCount.getDouble(3);
            double dLat = Math.toRadians(Latitude-LAT);
            double dLng = Math.toRadians(Longitude-LNG);
            double sindLat = Math.sin(dLat / 2);
            double sindLng = Math.sin(dLng / 2);
            double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2) * Math.cos(Math.toRadians(LAT)) * Math.cos(Math.toRadians(Latitude));
            double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
            double dist = earthRadius * c;
            if (dist<15){
                sourcename=mCount.getString(1);
                sList.add(sourcename);
            }
        }
        mCount.close();
       return sList;
    }

    public ArrayList<String> countDatabase1(Double LAT, Double LNG) {
        String destinationname=null;
        ArrayList<String> dList = new ArrayList<>();
        double earthRadius = 6371.75;
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor mCount= db.rawQuery("SELECT * FROM " + DatabaseHelper.TABLE_NAME + " WHERE " + DatabaseHelper.COL_3 + " BETWEEN (" +LAT+"- 0.1) AND ("+LAT+" + 0.1) AND " + DatabaseHelper.COL_4 + " BETWEEN (" +LNG+"- 0.1) AND ("+LNG+" + 0.1)", null);
        mCount.moveToFirst();
        while (mCount.moveToNext() ) {
            double Latitude = mCount.getDouble(2);
            double Longitude = mCount.getDouble(3);
            double dLat = Math.toRadians(Latitude-LAT);
            double dLng = Math.toRadians(Longitude-LNG);
            double sindLat = Math.sin(dLat / 2);
            double sindLng = Math.sin(dLng / 2);
            double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2) * Math.cos(Math.toRadians(LAT)) * Math.cos(Math.toRadians(Latitude));
            double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
            double dist = earthRadius * c;
            if (dist<15){
                destinationname = mCount.getString(4);
                dList.add(destinationname);
            }
        }
        mCount.close();
        return dList;
    }

    public String findBus(String sourcename, String desname){
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor mCount= db.rawQuery("select count(*) from search_table where name='" + sourcename + "' AND dname='"+desname+"'", null);
        mCount.moveToFirst();
        String src= mCount.getString(1);
        mCount.close();
         return src;
    }


    public Cursor getAllData() {
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor res = db.rawQuery("select * from " + TABLE_NAME, null);
        return res;
    }
}
like image 806
mach2 Avatar asked Oct 29 '22 16:10

mach2


1 Answers

I'd suggest that you have a few issues within the findBus method and the loops that invoke it.

1. Unecessary Loops

The 3 loops around the invocation of the findBus method appear to be useless as they repeatedly set the TextView but only the last will likely be visible and thus usable. You could go directly to the last element of the ArrayList's by using their size method.

I'd suggest that the following :-

tvvv.setText(ddList.get(ddList.size()-1));
TextView tvv = (TextView) findViewById(R.id.textView7);
tvv.setText(myDB.findBus(ssList.get(ssList.size()-1),ddList.get(ddList.size()-1)));

should replace :-

for(int i=0;i<dsize;i++) {
    tvvv.setText(ddList.get(i));
}

    for(int i=0;i<ssize;i++){
        String source = ssList.get(i);
        for(int j=0;j<dsize;j++) {
            String destination = ddList.get(j);
            String src = myDb.findBus(source, destination);

                TextView tvv = (TextView) findViewById(R.id.textView7);
                tvv.setText(src);

        }

    }

}

2. Invalid Offset

Additionally within the findBus method you are attempting to access the 2nd column returned from the query, when the query returns only 1 column. i.e. you have coded offset 1 whilst only offset 0 (column count(*)) is the only available column.

I'd suggest changing the findBus method to :-

public String findBus(String sourcename, String desname){
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor mCount= db.rawQuery("select count(*) from search_table where name='" + sourcename + "' AND dname='"+desname+"'", null);
    mCount.moveToFirst();
    String src= mCount.getString(0); //<<<< Changed offset to 0 from 1
    mCount.close();
    return src;
}

This would likely reduce the memory requirements, if by enough I have no idea though. However, you may also wish to check the Related links display to the right in regards to OOM (Out of Memory errors, perhaps the one with (Andorid)).

like image 63
MikeT Avatar answered Nov 15 '22 06:11

MikeT