ventajas utilidad una tener puede metodos metodo los las donde desventajas definicion definen declaran clases clase abstractos abstracto abstractas abstracta java android android-asynctask

java - una - utilidad de las clases abstractas



Looping AsyncTask Class debe declararse abstracto o implementar un método abstracto (3)

Cambia esto

protected String doInBackground(String urls3, String result3)

A

protected String doInBackground(String... args)

Luego declare sus variables como tal dentro de su función doInBackground

String urls3 = args[0]; String result3 = args[1];

También deberá corregir su onPostExecute para

protected void onPostExecute(String result)

Y tu declaración de clase para

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

Estoy intentando recorrer algunos registros en mi tabla y para cada registro, use un valor como parámetro para;

  1. obtener una página web para analizar algunos html
  2. obtener algunos datos JSON para analizar y obtener un par de valores de

Ambos funcionaron perfectamente por sí solos, pero no puedo lograr que trabajen en un AsyncTask. Tengo el código aquí. Sé que probablemente estoy muy lejos, pero si alguien pudiera darme un empujón sobre cómo mi pensamiento está apagado, realmente lo agradecería.

En la primera linea

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

yo obtengo

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

Como un mensaje de error y subrayado en rojo.

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(); } }


El método doInBackground se define así:

protected abstract Result doInBackground (Params... params)

Para anularlo, debe darle la misma lista de parámetros, es decir, un parámetro con tipo Params... Aquí, Params , el primer parámetro de tipo de AsyncTask , es Void .

Además, el tipo de resultado debe ser Result , que en este caso es Void , dado que Result es el tercer parámetro de tipo de AsyncTask , y está utilizando Void como el tercer parámetro.

Entonces, la única forma de escribir un método que anule doInBackground sería

Void doInBackground(Void... params)

lo que no creo es lo que quieres, ya que pareces querer que los parámetros sean cadenas. Así que creo que deberás cambiar el primer parámetro de tipo de AsyncTask , que probablemente debería ser

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

Si realmente desea que doInBackground devuelva una String , también deberá cambiar el tercer parámetro de tipo ( Result ):

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

Además, la lista de parámetros debe tener los mismos tipos; no puede anular el método con

protected String doInBackground(String urls3, String result3)

pero en cambio necesitas

protected String doInBackground(String... params)

Esto parece ser aceptable también:

protected String doInBackground(String[] params)

Si es necesario, verifique en tiempo de ejecución que obtuvo exactamente dos parámetros al marcar params.length .


Está extendiendo AsyncTask <Void, String, Void> lo que significa que está pasando String ... como argumento para el método doInBackground y el método doInBackground devolverá Void.

Pero, en su código, el método doInBackground devuelve String. Por lo tanto, debe cambiar AsyncTask <Void, String, Void> a AsyncTask <Void, String, String>.

Además, te falta @Override sobre el método doInBackground.

¡Espero eso ayude! :)