循环AsyncTask类必须声明为abstract或实现抽象方法
我试图遍历我的表中的一些记录,并为每个记录,使用值作为参数;
- 得到一个网页来解析一些HTML
- 获取一些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
的第一个类型参数Params
是Void
。
此外,结果类型必须是Result
,在本例中为Void
,因为Result
是AsyncTask
的第三个类型参数,并且您使用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
但是,在您的代码中,doInBackground方法返回String。 因此,您应该将AsyncTask
此外,您在doInBackground方法之上缺少@Override。
希望能帮助到你! 🙂