我正在尝试创建一个异步任务来处理一大堆数据库条目,然后让用户知道该条目是使用附加到自身的textView创建的。我知道我无法触及doInBackground
内的观点,但我无法使用任何其他方法。任何人都可以向我解释如何让我的代码在AsyncTask中工作吗?
代码:
private class DBADDITION extends AsyncTask<Object, Void, Object> {
@Override
protected String doInBackground(Object... params) {
DBAdapter my_database = new DBAdapter(getApplicationContext());
logout.append("\n" + "Start" + " ");
my_database.open();
String temp = input.getText().toString();
int i = Integer.parseInt(temp);
for (int j = 1; j <= i; j++) {
db.createEntry("example", 10 + j);
logout.setText("\n" + j + logout.getText());
}
db.close();
return "it worked";
}
protected void onProgressUpdate(Integer... progress) {
}
}
答案 0 :(得分:0)
logout.setText()
您无法从其他线程对UI执行操作。所有UI操作都必须在UI线程上进行。由于logout
是TextView对象,因此无法直接从doInBackground方法触摸它,因为它在不同的Thread上运行。你应该使用Handler
个实例,或者你引用了你的活动,你应该致电runOnUiThread
。 runOnUiThread
允许您在Runnable
的looper队列上发布UI Thread
,而无需实例化处理程序。
final int finalJ = j;
runOnUiThread(new Runnable() {
public void run() {
logout.setText("\n" + finalJ + logout.getText());
}
});
runOnUiThread(new Runnable() {
public void run() {
logout.append("\n" + "Start" + " ");
}
});
答案 1 :(得分:0)
您需要覆盖onPostExecute()
方法。这是在doInBackground()
方法后自动调用的。这也是在UI线程上,因此您可以在这里修改textView。
如果需要在doInBackground()之前执行一些UI更新,则覆盖onPreExecute()
方法。
此外,从doInBackground()
setText()
答案 2 :(得分:0)
您使用Activity.runOnUIThread()来设置setText,如下所示:
private class DBADDITION extends AsyncTask<Object, Void, Object> {
@Override
protected String doInBackground(Object... params) {
DBAdapter my_database = new DBAdapter(getApplicationContext());
logout.append("\n" + "Start" + " ");
my_database.open();
final String temp = input.getText().toString();
int i = Integer.parseInt(temp);
for (int j = 1; j <= i; j++) {
db.createEntry("example", 10 + j);
youractivity.this.runOnUiThread(new Runnable() {
public void run() {
logout.setText("\n" + j + logout.getText());
}
);
}
db.close();
return "it worked";
}
protected void onProgressUpdate(Integer... progress) {
}
}