循环AsyncTask类必须声明为abstract或实现抽象方法

时间:2014-12-15 21:36:34

标签: java android android-asynctask

我试图遍历表格中的一些记录,并为每条记录使用一个值作为参数;

  1. 获取一个网页来解析一些HTML
  2. 获取一些JSON数据进行解析并从
  3. 获取几个值

    这些都可以完美地完成,但我不能让它们都在AsyncTask中工作。我这里有代码。我知道我可能已经离开了,但是如果有人能够让我对我的思考方式有所了解,我真的很感激。

    在第一行

        private class FetchWebsiteData extends AsyncTask<Void, String, Void> {
    

    我得到了

    Class FetchWebsiteData must either be declared abstract or implement abstract method doInBackground(params...) in 'AsynTask' 
    

    作为错误消息并以红色加下划线。

    private class FetchWebsiteData extends AsyncTask<Void, String, Void> {
    
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mProgressDialog = new ProgressDialog(summary.this);
            mProgressDialog.setMessage("Loading...");
            mProgressDialog.setIndeterminate(false);
            mProgressDialog.show();
        }
    
    
        protected String doInBackground(String urls3, String result3) {
    
            helper = new TaskDBHelper(summary.this);
            SQLiteDatabase sqlDB = helper.getReadableDatabase();
    
            Cursor dataCount = sqlDB.rawQuery("select TASK from " + TaskContract.TABLE, null);
            ArrayList<String> temp = new ArrayList<String>();
            dataCount.moveToFirst();
            do {
                temp.add(dataCount.getString(0));
            } while (dataCount.moveToNext());
            dataCount.close();
            StringBuilder sb = new StringBuilder();
            for (String s : temp)
            {
                wallBal = s;
    
                //--------------------------------------------
    
                try {
                    Document document = Jsoup.connect(URL+wallBal).get();
                    Document doc = Jsoup.parse(document.text());
                    balance = new Double(doc.text());
                    helper = new TaskDBHelper(summary.this);
                    SQLiteDatabase sqlDB2 = helper.getWritableDatabase();
    
    
                    String sql9 = String.format("UPDATE " + TaskContract.TABLE + " SET " + TaskContract.Columns.OLDBAL + " = " + TaskContract.TABLE + "." + TaskContract.Columns.BAL + " WHERE task='" + wallBal + "'");
                    sqlDB2.execSQL(sql9);
    
                    String sql = String.format("UPDATE " + TaskContract.TABLE + " SET " + TaskContract.Columns.BAL + " = " + balance + " WHERE task='" + wallBal + "'");
                    sqlDB2.execSQL(sql);
                    Cursor dataCount2 = sqlDB.rawQuery("select " + TaskContract.Columns.OLDBAL + " from " + TaskContract.TABLE + " WHERE " + TaskContract.Columns.TASK + " = '" + wallBal + "'", null);
    
                    dataCount2.moveToFirst();
                    oldbalance = dataCount2.getDouble(0);
    
                    if(balance != oldbalance) {
                        make();
                    }
                    mProgressDialog.dismiss();
                    JSONObject json3 = new JSONObject(result3);
                    String str = "";
                    JSONArray articles3 = json3.getJSONArray("data");
    
                    str += "articles length = "+json3.getJSONArray("data").length();
                    str += "\n--------\n";
                    str += "names: "+articles3.getJSONObject(0).getString("MasternodeIP");
                    str += "\n--------\n";
    
    
                    MNIP = articles3.getJSONObject(0).getString("MasternodeIP");
                    Sts = articles3.getJSONObject(0).getString("ActiveCount");
    
                    helper = new TaskDBHelper(summary.this);
                    SQLiteDatabase sqlDB22 = helper.getWritableDatabase();
    
                    String sql91 = String.format("UPDATE " + TaskContract.TABLE + " SET " + TaskContract.Columns.IP + " = '" + MNIP + "' WHERE task='" + task + "'");
                    sqlDB22.execSQL(sql91);
    
                    String sql10 = String.format("UPDATE " + TaskContract.TABLE + " SET " + TaskContract.Columns.STATUS + " = '" + Sts + "' WHERE task='" + task + "'");
                    sqlDB22.execSQL(sql10);
    
    
                    updateUI();
    
    
                } catch (JSONException | IOException e) {
                    e.printStackTrace();
                }
                //-----------------------------------------------------
            }
    
    
            //--------------------------------------------------------------------
    
    
    
    
    
    
    
            //return null;
            return GET(urls3);
        }
    
        protected void onPostExecute(Void result) {
    
            updateUI();
    
        }
    }
    

3 个答案:

答案 0 :(得分:5)

更改此

protected String doInBackground(String urls3, String result3)

protected String doInBackground(String... args)

然后在doInBackground函数

中声明你的变量
String urls3 = args[0];
String result3 = args[1];

您还需要将onPostExecute更正为

protected void onPostExecute(String result)

你的班级声明

private class FetchWebsiteData extends AsyncTask<String, Void, String>

答案 1 :(得分:0)

doInBackground方法的定义如下:

protected abstract Result doInBackground (Params... params)

要覆盖它,您需要为其指定相同的参数列表,即类型为Params...的参数。此处ParamsAsyncTask的第一个类型参数Void

此外,结果类型必须为Result,在这种情况下为Void,因为ResultAsyncTask的第三个类型参数,而您&#39 ;使用Void作为第三个参数。

因此,编写覆盖doInBackground的方法的唯一方法是

Void doInBackground(Void... params)

我认为不是你想要的,因为你似乎希望参数是字符串。所以我相信您需要更改AsyncTask的第一个类型参数,该参数应该是

private class FetchWebsiteData extends AsyncTask<String, String, Void> {

如果您真的希望doInBackground返回String,您还需要更改第三个(Result)类型参数:

private class FetchWebsiteData extends AsyncTask<String, String, String> {

此外,参数列表必须具有相同的类型;你不能用

覆盖方法
protected String doInBackground(String urls3, String result3) 

但你需要

protected String doInBackground(String... params)

这似乎也可以接受:

protected String doInBackground(String[] params)

如有必要,请在运行时通过选中params.length验证您有两个参数。

答案 2 :(得分:0)

您正在扩展AsyncTask&lt; Void,String,Void&gt;这意味着你传递String ..作为doInBackground方法的参数,而doInBackground方法将返回Void。

但是,在你的代码中,doInBackground方法返回String。所以,你应该改变AsyncTask&lt; Void,String,Void&gt;到AsyncTask&lt; Void,String,String&gt;。

此外,您在doInBackground方法之上缺少@Override。

希望它有所帮助! :)