【发布时间】:2019-02-10 19:07:17
【问题描述】:
我已经在一个表格中预先填充了一个带有运动队名称的 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();
}
我希望 Activity 加载时使用填充了 Teams 表中团队名称的微调器,但应用程序在显示 Activity 之前崩溃,并出现与不允许在主线程上运行的查询相关的错误。
【问题讨论】:
标签: android android-asynctask android-spinner android-room executor