Хорошо, я скачал твой код и запустил его в AndroidStudio.Поэтому более современный способ избежать выполнения операций с базой данных в основном потоке - это делать это с исполнителями приложений.
Создайте новый класс в вашем проекте, который вызывает AppExecutors и выглядит следующим образом:
package com.timucin.locationholder;
import android.os.Handler;
import android.os.Looper;
import android.support.annotation.NonNull;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
public class AppExecutors {
// For Singleton instantiation
private static final Object LOCK = new Object();
private static AppExecutors sInstance;
private final Executor diskIO;
private final Executor mainThread;
private final Executor networkIO;
private AppExecutors(Executor diskIO, Executor networkIO, Executor mainThread) {
this.diskIO = diskIO;
this.networkIO = networkIO;
this.mainThread = mainThread;
}
public static AppExecutors getInstance() {
if (sInstance == null) {
synchronized (LOCK) {
sInstance = new AppExecutors(Executors.newSingleThreadExecutor(),
Executors.newFixedThreadPool(3),
new MainThreadExecutor());
}
}
return sInstance;
}
public Executor diskIO() {
return diskIO;
}
public Executor mainThread() {
return mainThread;
}
public Executor networkIO() {
return networkIO;
}
private static class MainThreadExecutor implements Executor {
private Handler mainThreadHandler = new Handler(Looper.getMainLooper());
@Override
public void execute(@NonNull Runnable command) {
mainThreadHandler.post(command);
}
}
}
Теперь вы можете использовать это для запуска операций базы данных.Например, в функции MainActivitys onCreate.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final GridView gridView= (GridView) findViewById(R.id.gridView);
list = new ArrayList<>();
//Database Operations
AppExecutors.getInstance().diskIO().execute(new Runnable() {
@Override
public void run() {
try {
MapsActivity.database = openOrCreateDatabase("Places",MODE_PRIVATE,null);
Cursor cursor = MapsActivity.database.rawQuery("SELECT * FROM places",null);
int nameIx = cursor.getColumnIndex("name");
int latitudeIx = cursor.getColumnIndex("latitude");
int longitudeIx = cursor.getColumnIndex("longitude");
while (cursor.moveToNext()) {
nameFromDatabase = cursor.getString(nameIx);
String latitudeFromDatabase = cursor.getString(latitudeIx);
String longitudeFromDatabase = cursor.getString(longitudeIx);
image = cursor.getBlob(3);
// names.add(nameFromDatabase);
Double l1 = Double.parseDouble(latitudeFromDatabase);
Double l2 = Double.parseDouble(longitudeFromDatabase);
// System.out.println("coordinates:"+l1+","+l2);
locationFromDatabase = new LatLng(l1, l2);
names.add(nameFromDatabase);
locations.add(locationFromDatabase);
list.add(new Location(nameFromDatabase, image));
adapter = new LocationListAdapter(getApplicationContext(), R.layout.location_items, list);
gridView.setAdapter(adapter);
System.out.println(names);
}
System.out.println(names);
cursor.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
И все готово.Вы должны сделать это со всеми операциями с вашей базой данных.На самом деле я не смог воспроизвести ошибку, которую вы получаете, поэтому я не знаю, решит ли она проблему.Но в любом случае выполнение операций с базой данных в главном потоке является плохой практикой и может привести к другим ошибкам.Попробуйте, я надеюсь, это поможет.