Java Can';无法使任务正常工作

Java Can';无法使任务正常工作,java,android,Java,Android,我试图创建一个异步任务来处理一大堆数据库条目,然后让用户知道该条目是用附加到自身的textView创建的。我知道我无法触摸doInBackground中的视图,但我无法使用任何其他方法。有人能给我解释一下如何让我的代码在异步任务中工作吗 代码: 私有类DBADDITION扩展了异步任务{ @凌驾 受保护的字符串doInBackground(对象…参数){ DBAdapter my_database=newdbadapter(getApplicationContext()); 注销。追加(“\n”

我试图创建一个异步任务来处理一大堆数据库条目,然后让用户知道该条目是用附加到自身的textView创建的。我知道我无法触摸
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) {

    }

}