我想在显示布局之前从数据库创建按钮。我需要这些按钮有一些onClick
方法,但是我在一个(主)线程上做了太多的错误。
使用了另一个线程但是另一个线程显示错误 - 无法修改来自不同线程的View
使用了AsyncTask ,但将所有工作添加到onPreExecute()
或onPostExecute()
并未解决任何问题并在doInBackground()
内执行此操作(不会有意义吗?)>>我想渲染按钮,但backfround进程不能影响主线程
//get data from database
DatabaseHelperTables myDb;
myDb = new DatabaseHelperTables(this);
tablelist = myDb.getTablesQuery();
if (tablelist != null) {
//each button two values [ID,Button_text] in list, therefore i+2
for (int i = 0; i < tablelist.size(); i = i + 2) {
final int index = i;
LinearLayout ll = (LinearLayout) findViewById(R.id.tlacitka);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
//create button, put inside layer
final Button button = new Button(this);
button.setPadding(10, 10, 10, 10);
button.setText(tablelist.get(i+1));
ll.addView(button, lp);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//pass this to another activity - perform action depending on button ID
newActivity.someValue = tablelist.get(index);
Intent intent = new Intent(getApplicationContext(), newActivity.class);
startActivity(intent);
}
});
}
}
所有这些都在OnCreate(Bundle savedInstanceState)
那么在没有在主线程上做太多工作的情况下,最有效的方法是什么?我当时只有两个按钮,但App将从Internet下载新数据并添加越来越多,具体取决于用户。
我想使用AsyncTask,但将上面的代码移到onPreExecute()
或onPostExecute()
会产生相同的结果。
编辑: 从数据库中获取数据
public List<String> getTablesQuery() {
List<String> query = new ArrayList<>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_NAME;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
while (cursor.moveToNext()) {
query.add(cursor.getString(1));
query.add(cursor.getString(2));
// Adding contact to list
}
cursor.close();
// return list
return query;
}
现在在后台运行AsyncTask:
@Override
protected Void doInBackground(Void... params) {
DatabaseHelperTables myDb;
myDb = new DatabaseHelperTables(getApplicationContext());
//list tablelist defined on the very top of activity
tablelist = myDb.getTablesQuery();
return null;
}
使用onclick方法在protected void onPostExecute(Void result)
错误:I / Choreographer:跳过44帧!申请可能是 在主线上做了太多工作。
答案 0 :(得分:0)
数据库查询后台线程并在UI线程上返回结果。此外,您可能同时创建了太多视图(具体取决于您拥有的数据量)。在这种情况下,我建议使用RecyclerView,它只能创建适合屏幕的视图。