Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: ¿Cómo ejecutar asynctask de diferentes archivos de clase?

Cuando uso mi código en un archivo de clase, funciona perfectamente:

package com.example.downloadfile; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.widget.TextView; public class DownloadFile extends Activity { public static final int DIALOG_DOWNLOAD_PROGRESS = 0; private ProgressDialog mProgressDialog; private static String fileName = "yo.html"; private static String fileURL = "http://example.com/tabletcms/tablets/tablet_content/000002/form/Best%20Form%20Ever/html"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView tv = new TextView(this); tv.setText("This is download file program with asynctask... "); tv.append("\nYo, this line is appended!"); startDownload(); } private void startDownload() { new DownloadFileAsync().execute(fileURL); } @Override protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_DOWNLOAD_PROGRESS: mProgressDialog = new ProgressDialog(this); mProgressDialog.setMessage("Downloading file.."); mProgressDialog.setIndeterminate(false); mProgressDialog.setMax(100); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setCancelable(true); mProgressDialog.show(); return mProgressDialog; default: return null; } } class DownloadFileAsync extends AsyncTask<String, String, String> { @Override protected void onPreExecute() { super.onPreExecute(); showDialog(DIALOG_DOWNLOAD_PROGRESS); } @Override protected String doInBackground(String... aurl) { try { File root = Environment.getExternalStorageDirectory(); URL u = new URL(fileURL); HttpURLConnection c = (HttpURLConnection) u.openConnection(); c.setRequestMethod("GET"); c.setDoOutput(true); c.connect(); int lenghtOfFile = c.getContentLength(); FileOutputStream f = new FileOutputStream(new File(root + "/download/", fileName)); InputStream in = c.getInputStream(); byte[] buffer = new byte[1024]; int len1 = 0; long total = 0; while ((len1 = in.read(buffer)) > 0) { total += len1; //total = total + len1 publishProgress("" + (int)((total*100)/lenghtOfFile)); f.write(buffer, 0, len1); } f.close(); } catch (Exception e) { Log.d("Downloader", e.getMessage()); } return null; } protected void onProgressUpdate(String... progress) { Log.d("ANDRO_ASYNC",progress[0]); mProgressDialog.setProgress(Integer.parseInt(progress[0])); } @Override protected void onPostExecute(String unused) { dismissDialog(DIALOG_DOWNLOAD_PROGRESS); } } } 

Quiero ejecutar la asyntax que tengo de un archivo de clase diferente, tengo mi código:

DescargarFile.java

 package com.example.downloadfile; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.widget.TextView; public class DownloadFile extends Activity { private static String fileName = "yo.html"; private static String fileURL = "http://example.com/tabletcms/tablets/tablet_content/000002/form/Best%20Form%20Ever/html"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView tv = new TextView(this); tv.setText("This is download file program with asynctask... "); tv.append("\nYo, this line is appended!"); startDownload(); } private void startDownload() { new DownloadFileAsync().execute(fileURL); } } 

DescargarFileAsync.java

 package com.example.downloadfile; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.app.Dialog; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Environment; import android.util.Log; class DownloadFileAsync extends AsyncTask<String, String, String> { public static final int DIALOG_DOWNLOAD_PROGRESS = 0; private ProgressDialog mProgressDialog; @Override protected void onPreExecute() { super.onPreExecute(); showDialog(DIALOG_DOWNLOAD_PROGRESS); } @Override protected String doInBackground(String... aurl) { try { File root = Environment.getExternalStorageDirectory(); URL u = new URL(fileURL); HttpURLConnection c = (HttpURLConnection) u.openConnection(); c.setRequestMethod("GET"); c.setDoOutput(true); c.connect(); int lenghtOfFile = c.getContentLength(); FileOutputStream f = new FileOutputStream(new File(root + "/download/", fileName)); InputStream in = c.getInputStream(); byte[] buffer = new byte[1024]; int len1 = 0; long total = 0; while ((len1 = in.read(buffer)) > 0) { total += len1; //total = total + len1 publishProgress("" + (int)((total*100)/lenghtOfFile)); f.write(buffer, 0, len1); } f.close(); } catch (Exception e) { Log.d("Downloader", e.getMessage()); } return null; } protected void onProgressUpdate(String... progress) { Log.d("ANDRO_ASYNC",progress[0]); mProgressDialog.setProgress(Integer.parseInt(progress[0])); } @Override protected void onPostExecute(String unused) { dismissDialog(DIALOG_DOWNLOAD_PROGRESS); } @Override protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_DOWNLOAD_PROGRESS: mProgressDialog = new ProgressDialog(this); mProgressDialog.setMessage("Downloading file.."); mProgressDialog.setIndeterminate(false); mProgressDialog.setMax(100); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setCancelable(true); mProgressDialog.show(); return mProgressDialog; default: return null; } } } 

Estoy usando eclipse y estoy recibiendo errores en mi archivo DownloadFile.java, hay muchos códigos subrayados en rojo …. Soy nuevo en java y android dev.

  • Android: OnBootReceiver: El receptor exportado no requiere permiso
  • La carpeta ".android" y el archivo "debug.keystore" faltan
  • Actualización de contenido de ScrollView
  • Cómo rellenar el adaptador RecyclerView con Firebase
  • ¿Cómo envío un archivo csv / texto desde un teléfono Android a una impresora wifi?
  • Bucle eficiente a través de la lista de Java
  • Intentar invocar método virtual
  • Llame a la biblioteca C ++ de Java en Android
  • 4 Solutions collect form web for “Android: ¿Cómo ejecutar asynctask de diferentes archivos de clase?”

    Si de alguna manera puede pasar la clase Activity o su contexto al AsyncTask que resolverá su problema para mostrar el diálogo. Debería incluir otro parámetro junto con la URL que está enviando y poner ese parámetro en una variable de Context . Y luego, cada vez que necesite el diálogo, utilice esa variable de contexto para mostrarla.

    Si el cuadro de diálogo no tiene un contexto desde el que mostrarlo, definitivamente se ejecutará en errores de ejecución.

    Actualizar (poner mi comentario hasta aquí también): aquí vamos … encontró un buen ejemplo que puede modificar para hacer uso de su caso. Está en brighthub.com/mobile/google-android/articles/82805.aspx . Desplácese hasta la sección Código fuente y eche un vistazo al código de WebServiceAsyncTask y WebServiceBackgroundActivity.

    Algunos cambios en su código harán que funcione:

     public class DownloadFileAsync extends AsyncTask<String, String, String> { public static final int DIALOG_DOWNLOAD_PROGRESS = 0; private ProgressDialog mProgressDialog; private Context context; public DownloadFileAsync(Context context) { this.context = context; mProgressDialog = new ProgressDialog(context); mProgressDialog.setMessage("Downloading file.."); mProgressDialog.setIndeterminate(false); mProgressDialog.setMax(100); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setCancelable(true); } @Override protected void onPreExecute() { super.onPreExecute(); mProgressDialog.show(); } @Override protected String doInBackground(String... aurl) { try { File root = Environment.getExternalStorageDirectory(); URL u = new URL(aurl[0]); HttpURLConnection c = (HttpURLConnection) u.openConnection(); c.setRequestMethod("GET"); c.setDoOutput(true); c.connect(); int lenghtOfFile = c.getContentLength(); FileOutputStream f = new FileOutputStream(new File(root + "/download/", aurl[1])); InputStream in = c.getInputStream(); byte[] buffer = new byte[1024]; int len1 = 0; long total = 0; while ((len1 = in.read(buffer)) > 0) { total += len1; //total = total + len1 publishProgress("" + (int)((total*100)/lenghtOfFile)); f.write(buffer, 0, len1); } f.close(); } catch (Exception e) { Log.d("Downloader", e.getMessage()); } return null; } protected void onProgressUpdate(String... progress) { Log.d("ANDRO_ASYNC",progress[0]); mProgressDialog.setProgress(Integer.parseInt(progress[0])); } @Override protected void onPostExecute(String unused) { mProgressDialog.dismiss(); } } 

    Y la clase DownloadFile:

     public class DownloadFile extends Activity { private static String fileName = "yo.html"; private static String fileURL = "http://mydomain.com/tabletcms/tablets/tablet_content/000002/form/Best%20Form%20Ever/html"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView tv = new TextView(this); tv.setText("This is download file program with asynctask... "); tv.append("\nYo, this line is appended!"); startDownload(); } private void startDownload() { new DownloadFileAsync(this).execute(fileURL,fileName); } } 

    Sé que es demasiado tarde para ayudarte, pero para otros esto puede ayudar.

    Su tan simple Simplemente construir un objeto de clase principal y que llamar a la clase interna como este

      OuterMainClass outer = new OuterMainClass(); outer.new InnerAsyncClass(param) .execute(); 

    Gracias

    El problema real puede ser error de nivel de clase, es posible que no esté colocando clase asíncrona y descarga clase en el mismo paquete. Otro problema que puedo ver es la clase asíncrona usando showDialog() , onCreateDialog() etc., que está disponible sólo si su clase extiende Activity .

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.