【问题标题】:Call Asynctask execute with void and cursor as parameters调用 Asynctask 以 void 和 cursor 作为参数执行
【发布时间】:2020-05-10 19:54:02
【问题描述】:

我写了一个Asynctask

private class dboperation extends AsyncTask<Void, Void, Cursor>

我是 android 新手,在 google 中搜索了很多内容,但对如何使用这些参数从另一个类调用异步任务感到震惊。

代码

private class dboperation extends AsyncTask<Void, Void, Cursor>{


        @Override
        protected Cursor doInBackground(Void... params) {
            // TODO Auto-generated method stub
            getstocks="Select " + st.column1 + " as _id, " + st.column3 + " From "+ st.tablename;
            a1=Database.getInstance(getApplicationContext()).getWritableDatabase().rawQuery(getstocks, null);


            return null;
        }


        protected void onPostExecute(Cursor result) {
            if(a1.moveToNext())
            {
                displaystocks.setVisibility(View.INVISIBLE);
            }
            final poplist populatestocks=new poplist(getApplicationContext(),a1) ;
            popstocks.setAdapter(populatestocks);
        }

        @Override
        protected void onPreExecute() {
        }

        protected void onProgressUpdate(Void... values) {
        }


    }

当我以这种方式调用时,它给了我错误“Void 无法解析为变量”。

dboperation.execute(Void,Void,a1);

我该如何解决这个问题?

【问题讨论】:

  • 您到底想要什么?你需要光标在哪个方法上?
  • 我想知道如何使用上述参数为 Asynctask 编写执行,因为正如您在我声明为 dboperation.execute(Void,Void,a1); 时看到的那样。它正在抛出错误
  • @Siva : AsyncTask.execute(Params... params) 其中params 是您要传递给doInBackground 以便执行任务使用dboperation.execute((Void)null);dboperation.execute(); 的参数
  • 仍然不接受给出错误无法从 AsyncTask 类型对非静态方法 execute(Void...) 进行静态引用

标签: android android-asynctask


【解决方案1】:

在 异步任务

  • 第一个参数表示您可以传递执行的类型。无效意味着你什么都不能通过

Java 中的类名应以大写字母开头。请重命名它以便其他人更好地阅读。

所以正确的调用是

new DbOperation().execute();
  • 第二个参数是一种可以从 doInBackground() 调用 publishProgress() 发布的数据。您不使用 publishProgress,因此在这种情况下无需提及。

  • 第三个参数表示将传递给 onPostExecute() 的类型。要将光标传递给 onPostExecute,您必须从 doInBackground 中返回它

    @Override
    protected Cursor doInBackground(Void... params) {
    
        getstocks="Select " + st.column1 + " as _id, " + st.column3 + " From "+ st.tablename;
        return Database.getInstance(getApplicationContext()).getWritableDatabase().rawQuery(getstocks, null);
    }
    

【讨论】:

  • 感谢您的回复,但它不允许我声明为 dboperation.execute(); 任何方式
  • 是的,那是因为你用小写字母调用了一个类,这是误导性的。它从一个小写字母开始,所以我认为它已经是一个实例。在你的情况下,调用 new dboperation().execute();
  • 太完美了....现在它可以工作了..你能不能把重点放在为什么它在使用时没有响应小写
  • @Sive 它正在响应,但您没有正确调用它。您必须 new dboperation().execute();,而不是 dboperation.execute();(如果 dboperation 不是指向实例而是指向一个类)。
  • 非常感谢......成功了......实际上我是java和android的新手
【解决方案2】:
   AsyncTask<Void, Void, Void>

asynkTask 类获取三个参数。用于doInBackground 的第一个参数,如果你想从活动类或其他任何地方发送一个参数到这个类,你必须在 Execute 方法中作为参数发送。喜欢:

boperation.execute(a1);

用于onProgressUpdate() 方法的第二个值,您可以向用户显示进度。

用于onPostExecute() 的第三个值,您希望在完成一些工作后使用UI 线程。

现在,如果您想将方法发送到 onPostExecute(),您需要在 doInBackground 方法中执行此操作并返回值,例如:

@Override
protected Cursor doInBackground(Void... params) {
            // TODO Auto-generated method stub
            getstocks="Select " + st.column1 + " as _id, " + st.column3 + " From "+ st.tablename;
            a1=Database.getInstance(getApplicationContext()).getWritableDatabase().rawQuery(getstocks, null);


            return YourCursor;
        }

在 onPostExecute() 方法中你必须有类似的东西:

 protected void onPostExecute(Cursor result) {
            if(a1.moveToNext())
            {
                displaystocks.setVisibility(View.INVISIBLE);
            }
            final poplist populatestocks=new poplist(getApplicationContext(),a1) ;
            popstocks.setAdapter(populatestocks);
        }

因此,如果您不想向 asyncTask 类发送任何内容,则必须调用

 new boperation.execute();

或者您可以创建一个对象并调用执行方法,例如:

boperation object = new boperation();
object.execute();

【讨论】:

  • 感谢@Shayan,您的解释对我很有帮助。我已经相应地更改了代码。
猜你喜欢
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多