Java Can';无法使任务正常工作
我试图创建一个异步任务来处理一大堆数据库条目,然后让用户知道该条目是用附加到自身的textView创建的。我知道我无法触摸Java Can';无法使任务正常工作,java,android,Java,Android,我试图创建一个异步任务来处理一大堆数据库条目,然后让用户知道该条目是用附加到自身的textView创建的。我知道我无法触摸doInBackground中的视图,但我无法使用任何其他方法。有人能给我解释一下如何让我的代码在异步任务中工作吗 代码: 私有类DBADDITION扩展了异步任务{ @凌驾 受保护的字符串doInBackground(对象…参数){ DBAdapter my_database=newdbadapter(getApplicationContext()); 注销。追加(“\n”
doInBackground
中的视图,但我无法使用任何其他方法。有人能给我解释一下如何让我的代码在异步任务中工作吗
代码:
私有类DBADDITION扩展了异步任务{
@凌驾
受保护的字符串doInBackground(对象…参数){
DBAdapter my_database=newdbadapter(getApplicationContext());
注销。追加(“\n”+“开始”+”);
my_database.open();
String temp=input.getText().toString();
int i=整数.parseInt(temp);
对于(int j=1;j
您不能从其他线程对UI执行操作。所有UI操作都必须在UI线程上执行。由于注销
是一个TextView对象,您不能从doInBackground方法直接触摸它,因为它运行在不同的线程上。您应该使用处理程序
实例,或者,您有一个对y的引用我们的活动,您应该调用runOnUiThread
runOnUiThread
允许您在UI线程的循环器队列上发布Runnable
,而无需实例化处理程序
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" + " ");
}
});
您需要重写onPostExecute()
方法。这是在doInBackground()
方法之后自动调用的。这也是在UI线程上,因此您可以在此处修改textView
在这种情况下,您需要在doInBackground()之前执行一些UI更新,然后重写onPreExecute()
方法
另外,从doInBackground()
中删除任何UI元素更新的实例,如setText()
您使用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) {
}
}
私有类DBADDITION扩展了异步任务{
@凌驾
受保护的字符串doInBackground(对象…参数){
DBAdapter my_database=newdbadapter(getApplicationContext());
注销。追加(“\n”+“开始”+”);
my_database.open();
最终字符串temp=input.getText().toString();
int i=整数.parseInt(temp);
对于(int j=1;j),只有在所有工作实际完成时,才应该在onPostExecute
方法中返回“it worked”。更新ui应该在ui线程上完成,使用runonuithread或处理程序,或者在我尝试返回“void”时更新ui onPostExecute()它不允许我这样做。考虑到你的asyctask,你已经返回了一个对象。你可以返回Void。是的,注销是一个文本视图。好的,这看起来可能有效,但我遇到了最后一个问题。j必须设置为final,但当我设置为final时,我不能执行j++操作,因为解决方法是你可以将j指定给final int值。检查我的edit@blackbelt这是一只猿猴你能帮我做这件事吗。
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" + " ");
}
});
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) {
}
}