Lorsque j'utilise mon code dans un fichier de classe, il fonctionne parfaitement:
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);
}
}
}
Je veux exécuter la tâche asynchrone que j'ai à partir d'un fichier de classe différent, j'ai mon 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;
}
}
}
J'utilise Eclipse et j'obtiens des erreurs dans mon fichier DownloadFile.Java, il y a beaucoup de codes soulignés en rouge .... Je suis nouveau sur Java et Android dev.
Si vous pouvez en quelque sorte transmettre la classe Activity ou son contexte à AsyncTask, cela résoudra votre problème d'affichage de la boîte de dialogue. Vous devez inclure un autre paramètre avec l'URL que vous envoyez et placer ce paramètre dans une variable Context
. Et chaque fois que vous avez besoin de la boîte de dialogue, vous utilisez cette variable de contexte pour l'afficher.
Si la boîte de dialogue n'a pas de contexte à partir duquel elle sera affichée, elle entraînera certainement des erreurs d'exécution.
Mise à jour (mettez également mon commentaire ici): c'est parti ... trouvé un bon exemple que vous pouvez modifier pour faire usage de votre cas. C'est à brighthub.com/mobile/google-Android/articles/82805.aspx . Faites défiler vers le bas jusqu'à la section Code source et consultez le code de WebServiceAsyncTask et WebServiceBackgroundActivity.
Quelques changements dans votre code le feront fonctionner:
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();
}
}
Et classe 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);
}
}
Je sais qu'il est trop tard pour vous aider, mais pour d'autres, cela peut aider.
C'est si simple de construire simplement un objet de classe principale et d'appeler la classe interne comme ceci
OuterMainClass outer = new OuterMainClass();
outer.new InnerAsyncClass(param)
.execute();
Merci
Le problème réel peut être une erreur au niveau de la classe, vous ne pouvez pas placer la classe asynchrone et télécharger la classe dans le même package. Un autre problème que je peux voir est la classe asynchrone utilisant showDialog()
, onCreateDialog()
etc., qui n'est disponible que si votre classe étend Activity
.