java.lang.OutOfMemoryError:尝试抛出OutOfMemoryError时抛出OutOfMemoryError;没有可用的堆栈跟踪

mac*_*ch2 6 java android exception out-of-memory android-studio

我正在尝试将用户提供的经纬度值与数据库中的经纬度值进行比较。如果它们在彼此 15 公里半径内,则应更改文本视图。\n但我面临以下错误,

\n\n

我的数据库包含值 source lat = 19.218418 source long = 73.08661\nDes lat = 18.9766017 des long = 72.8326658。用户提供的值是\nsoure lat = 19.2213935 source long= 73.081532 des lat = 18.9632933 des long = 72.8324848。

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

结果.java

\n\n
public class result extends Activity {\nDatabaseHelper myDb;\n\n@Override\nprotected void onCreate(Bundle savedInstanceState) {\n    myDb = new DatabaseHelper(this);\n\n    super.onCreate(savedInstanceState);\n    setContentView(R.layout.layout_result);\n    String url = getIntent().getExtras().getString("username");\n    String url1 = getIntent().getExtras().getString("username1");\n    TextView tv= (TextView)findViewById(R.id.textView2);\n    TextView tv1= (TextView)findViewById(R.id.textView5);\n\n\n    String[] separated = url.split("_");\n    String srclat = separated[0];\n        Double dsrclat= Double.parseDouble(srclat);\n    String srclng = separated[1];\n        Double dsrclng= Double.parseDouble(srclng);\n\n    String[] separated1 = url.split("_");\n    String deslat = separated1[0];\n         Double ddeslat= Double.parseDouble(deslat);\n    String deslng = separated1[1];\n         Double ddeslng= Double.parseDouble(deslng);\n\n    tv.setText(url);\n    tv1.setText(url1);\n\n}\n\npublic void Database(View view){\n    Intent intent = new Intent(result.this, feeder.class);\n    startActivity(intent);\n}\n\n\npublic void NearestValue(View view){\n\n\n    TextView tv= (TextView)findViewById(R.id.textView2);\n    String s1 = tv.getText().toString();\n    String[] separated = s1.split("_");\n    String deslat = separated[0];\n    Double Lat= Double.parseDouble(deslat);\n    String deslng = separated[1];\n    Double Lng= Double.parseDouble(deslng);\n    ArrayList<String> ssList = new ArrayList<>();\n    ssList = myDb.countDatabase(Lat,Lng);\n    int ssize = ssList.size();\n    TextView tvvv = (TextView) findViewById(R.id.textView8);\n    for(int i=0;i<ssize;i++) {\n        tvvv.setText(ssList.get(i));\n    }\n\n    TextView tv1= (TextView)findViewById(R.id.textView5);\n    String s11 = tv1.getText().toString();\n    String[] separated1 = s11.split("_");\n    String deslat1 = separated1[0];\n    Double Lat1= Double.parseDouble(deslat1);\n    String deslng1 = separated1[1];\n    Double Lng1= Double.parseDouble(deslng1);\n    ArrayList<String> ddList = new ArrayList<>();\n    ddList = myDb.countDatabase1(Lat1,Lng1);\n    int dsize = ddList.size();\n    TextView tvvvv = (TextView) findViewById(R.id.textView9);\n    for(int i=0;i<dsize;i++) {\n        tvvv.setText(ddList.get(i));\n    }\n\n        for(int i=0;i<ssize;i++){\n            String source = ssList.get(i);\n            for(int j=0;j<dsize;j++) {\n                String destination = ddList.get(j);\n                String src = myDb.findBus(source, destination);\n\n                    TextView tvv = (TextView) findViewById(R.id.textView7);\n                    tvv.setText(src);\n\n            }\n\n        }\n\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

数据库助手

\n\n
    public class DatabaseHelper extends SQLiteOpenHelper {\n    public static final String DATABASE_NAME = "Nearby.db";\n    public static final String TABLE_NAME = "halt_details";\n    public static final String COL_2 = "snme";\n    public static final String COL_3 = "slati";\n    public static final String COL_4 = "slong";\n    public static final String COL_5 = "dnme";\n    public static final String COL_6 = "dlati";\n    public static final String COL_7 = "dlong";\n    public static final String COL_8 = "buses";\n\n    public DatabaseHelper(Context context) {\n        super(context, DATABASE_NAME, null, 1);\n    }\n\n    @Override\n    public void onCreate(SQLiteDatabase db) {\n        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)");\n    }\n\n    @Override\n    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {\n        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);\n        onCreate(db);\n    }\n\n    public void insertData(String sname, Double slat, Double slng, String dname, Double dlat, Double dlng, String bus) {\n        SQLiteDatabase db = this.getWritableDatabase();\n        ContentValues contentValues = new ContentValues();\n        contentValues.put("snme",sname);\n        contentValues.put("slati",slat);\n        contentValues.put("slong",slng);\n        contentValues.put("dnme",dname);\n        contentValues.put("dlati",dlat);\n        contentValues.put("dlong",dlng);\n        contentValues.put("buses",bus);\n\n        db.insert(TABLE_NAME,null ,contentValues);\n    }\n\n    public void clearDatabase() {\n        SQLiteDatabase db = this.getWritableDatabase();\n        String clearDBQuery = "DELETE FROM "+TABLE_NAME;\n        db.execSQL(clearDBQuery);\n    }\n\n    public ArrayList<String> countDatabase(Double LAT, Double LNG) {\n        String sourcename=null;\n        double earthRadius = 6371.75;\n        ArrayList<String> sList = new ArrayList<>();\n        SQLiteDatabase db = this.getWritableDatabase();\n        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);\n        mCount.moveToNext();\n        while (mCount.moveToFirst()) {\n            double Latitude = mCount.getDouble(2);\n            double Longitude = mCount.getDouble(3);\n            double dLat = Math.toRadians(Latitude-LAT);\n            double dLng = Math.toRadians(Longitude-LNG);\n            double sindLat = Math.sin(dLat / 2);\n            double sindLng = Math.sin(dLng / 2);\n            double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2) * Math.cos(Math.toRadians(LAT)) * Math.cos(Math.toRadians(Latitude));\n            double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));\n            double dist = earthRadius * c;\n            if (dist<15){\n                sourcename=mCount.getString(1);\n                sList.add(sourcename);\n            }\n        }\n        mCount.close();\n       return sList;\n    }\n\n    public ArrayList<String> countDatabase1(Double LAT, Double LNG) {\n        String destinationname=null;\n        ArrayList<String> dList = new ArrayList<>();\n        double earthRadius = 6371.75;\n        SQLiteDatabase db = this.getWritableDatabase();\n        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);\n        mCount.moveToFirst();\n        while (mCount.moveToNext() ) {\n            double Latitude = mCount.getDouble(2);\n            double Longitude = mCount.getDouble(3);\n            double dLat = Math.toRadians(Latitude-LAT);\n            double dLng = Math.toRadians(Longitude-LNG);\n            double sindLat = Math.sin(dLat / 2);\n            double sindLng = Math.sin(dLng / 2);\n            double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2) * Math.cos(Math.toRadians(LAT)) * Math.cos(Math.toRadians(Latitude));\n            double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));\n            double dist = earthRadius * c;\n            if (dist<15){\n                destinationname = mCount.getString(4);\n                dList.add(destinationname);\n            }\n        }\n        mCount.close();\n        return dList;\n    }\n\n    public String findBus(String sourcename, String desname){\n        SQLiteDatabase db = this.getWritableDatabase();\n        Cursor mCount= db.rawQuery("select count(*) from search_table where name=\'" + sourcename + "\' AND dname=\'"+desname+"\'", null);\n        mCount.moveToFirst();\n        String src= mCount.getString(1);\n        mCount.close();\n         return src;\n    }\n\n\n    public Cursor getAllData() {\n        SQLiteDatabase db = this.getWritableDatabase();\n        Cursor res = db.rawQuery("select * from " + TABLE_NAME, null);\n        return res;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Mik*_*keT 3

我建议您在该findBus方法和调用它的循环中遇到一些问题。

1. 不必要的循环

围绕该方法的调用的 3 个循环findBus似乎是无用的,因为它们重复设置,TextView但只有最后一个可能是可见的并因此可用。ArrayList您可以使用他们的方法直接转到 的最后一个元素size

我建议如下:-

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)));
Run Code Online (Sandbox Code Playgroud)

应该替换:-

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);

        }

    }

}
Run Code Online (Sandbox Code Playgroud)

2. 无效偏移量

此外,当查询仅返回 1 列时,在 findBus 方法中,您尝试访问从查询返回的第二列。即您已编码偏移量1,而只有偏移量0(列count(*))是唯一可用的列。

我建议将findBus方法更改为:-

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;
}
Run Code Online (Sandbox Code Playgroud)

这可能会减少内存需求,但我不知道是否足够。但是,您可能还希望检查右侧显示的有关 OOM 的相关链接(内存不足错误,可能是带有(Andorid)的错误)。