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

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

  1. 得到一个网页来解析一些HTML
  2. 获取一些JSON数据来解析并从中获取几个值

这些都可以完美地完成,但我不能让它们都在AsyncTask中工作。 我这里有代码。 我知道我可能已经离开了,但是如果有人能给我一个关于我的想法如何消失的推动,我真的很感激。

在第一行

private class FetchWebsiteData extends AsyncTask { 

我明白了

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

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

 private class FetchWebsiteData extends AsyncTask { @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 temp = new ArrayList(); 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(); } } 

改变这个

 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) 

和你的class级声明

 private class FetchWebsiteData extends AsyncTask 

doInBackground方法定义如下:

 protected abstract Result doInBackground (Params... params) 

要覆盖它,您需要为它提供相同的参数列表,即类型为Params... 。 这里, Params的第一个类型参数ParamsVoid

此外,结果类型必须是Result ,在本例中为Void ,因为ResultAsyncTask的第三个类型参数,并且您使用Void作为第三个参数。

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

 Void doInBackground(Void... params) 

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

 private class FetchWebsiteData extends AsyncTask { 

如果你真的想让doInBackground返回一个String ,你还需要更改第三个( Result )类型参数:

 private class FetchWebsiteData extends AsyncTask { 

此外,参数列表必须具有相同的类型; 你无法覆盖该方法

 protected String doInBackground(String urls3, String result3) 

但你需要

 protected String doInBackground(String... params) 

这似乎也是可以接受的:

 protected String doInBackground(String[] params) 

如有必要,通过检查params.length在运行时validation您有两个参数。

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

但是,在您的代码中,doInBackground方法返回String。 因此,您应该将AsyncTask 更改为AsyncTask

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

希望能帮助到你! 🙂