我试图遍历表格中的一些记录,并为每条记录使用一个值作为参数;
这些都可以完美地完成,但我不能让它们都在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();
}
}
答案 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...
的参数。此处Params
是AsyncTask
的第一个类型参数Void
。
此外,结果类型必须为Result
,在这种情况下为Void
,因为Result
是AsyncTask
的第三个类型参数,而您&#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。
希望它有所帮助! :)