Я предварительно заполнил базу данных Android Room с именами спортивных команд в таблице.Я хочу заполнить счетчик нижеуказанных действий этими именами.Мне нужно выполнить несколько похожих задач, и я не могу использовать основной поток для этого.Как я могу сделать это, используя asynctask или executor?
Эти данные не являются действительными и не изменятся, но будут вызваны для заполнения нескольких различных виджетов.
`//Activity`
public class RegisterPlayers extends AppCompatActivity {
public static PlayerRegistryDatabase playerRegistryDatabase;
`@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register_players);
createTeamsSpinner();
}
private Spinner createTeamsSpinner() {
Spinner spinner = findViewById(R.id.rank1);
List<Teams> teamName = PlayerRegistryDatabase.getInstance(this).playerRegistryDao().getAllTeams();
List<String> teamNameStrings = new LinkedList<>();
for (int i = 0; i < teamName.size(); i++) {
teamNameStrings.add(teamName.get(i).getTeamName());
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line,
teamNameStrings);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
return spinner;
}
}
`
`//Teams Class`
@Entity
`public class Teams {private String conferenceName;`
@PrimaryKey@NonNull
private String teamName;
public Teams(String conferenceName, String teamName) {
this.conferenceName = conferenceName;
this.teamName = teamName;
}
public String getConferenceName() {
return conferenceName;
}
public void setConferenceName(String conferenceName) {
this.conferenceName = conferenceName;
}
public String getTeamName() {
return teamName;
}
public void setTeamName(String teamName) {
this.teamName = teamName;
}
public static Teams[] populateData() {
return new Teams[] {
new Teams("W", "Panthers"),
new Teams("W", "Eagles"),
new Teams("E", "Bulldogs"),
new Teams("E", "Cheetahs"),
};
}`
`//Dao`
`@Dao
public interface PlayerRegistryDao {`
@Insert
void insertAll(Teams... teamName);
@Query("SELECT * FROM Teams")
List<Teams> getAllTeams();
`}`
`//Database`
@Database(entities = {PlayerRegistry.class, Teams.class}, version = 1, exportSchema = false)
`public abstract class PlayerRegistryDatabase extends RoomDatabase {`
private static PlayerRegistryDatabase buildDatabase(final Context context) {
return Room.databaseBuilder(context,
PlayerRegistryDatabase.class,
"teams")
.addCallback(new Callback() {
@Override
//@NonNull error, tried android support option
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
Executors.newSingleThreadScheduledExecutor().execute(new Runnable() {
@Override
public void run() {
getInstance(context).playerRegistryDao().insertAll(Teams.populateData());
}
});
}
})
.build();
}
Я ожидаю, что загрузка будет загружена с счетчиком, заполненным именами команд изтаблицы «Команды», но приложение вылетает перед отображением действия с ошибкой, связанной с запросами, не разрешенными для запуска в главном потоке.