Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: How to run asynctask from different class file?

When I use my code in one class file, it runs perfectly:

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

I want to run the asyntask I have from a different class file, I have my code:

DownloadFile.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);     }  } 

DownloadFileAsync.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;         }     } } 

I'm using eclipse and I'm getting errors in my DownloadFile.java file, there are many red underlined codes.... I'm new to java and android dev.

like image 737
Kris Avatar asked May 25 '11 03:05

Kris


People also ask

How can I use AsyncTask in different activities in android?

AsyncTask class is firstly executed using execute() method. In the first step AsyncTask is called onPreExecute() then onPreExecute() calls doInBackground() for background processes and then doInBackground() calls onPostExecute() method to update the UI.

Is AsyncTask deprecated in Android?

This class was deprecated in API level 30.

What is the replacement of AsyncTask?

Alternative 1: Using Executor and Handler The executor will help in performing any task in the background and the handler will help to make UI changes.


Video Answer


2 Answers

Some changes in your code will make it work :

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

And DownloadFile Class :

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); }  } 
like image 135
Sadeshkumar Periyasamy Avatar answered Sep 22 '22 22:09

Sadeshkumar Periyasamy


If you can somehow pass the Activity class or its context to the AsyncTask that will solve your issue for showing dialog. You would need to include another parameter together with the URL you are sending and put that parameter in a Context variable. And then whenever you need the dialog you use that context variable to show it.

If the dialog does not have a Context from which to show it will definitely run into runtime errors.

Update (put my comment up here as well): here we go... found a good example that you can modify to make use for your case. It's at brighthub.com/mobile/google-android/articles/82805.aspx. Scroll down to Source Code section and have a look at the code for WebServiceAsyncTask and WebServiceBackgroundActivity.

like image 42
Gligor Avatar answered Sep 21 '22 22:09

Gligor