无法让AsyncTask工作

时间:2013-05-07 07:07:53

标签: java android

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

        }

    }

3 个答案:

答案 0 :(得分:0)

logout.setText()

您无法从其他线程对UI执行操作。所有UI操作都必须在UI线程上进行。由于logout是TextView对象,因此无法直接从doInBackground方法触摸它,因为它在不同的Thread上运行。你应该使用Handler个实例,或者你引用了你的活动,你应该致电runOnUiThreadrunOnUiThread允许您在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()

中移除任何UI元素更新的实例

答案 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) {

    }

}