Я пытаюсь создать AsyncTask, который загружает Zip-файл и отображает ход загрузки внутри уведомления.AsyncTask с уведомлением
Я звоню:
new MyAsyncTask.DownloadTask(context, position,list).execute(0);
, которые относятся к этому:
import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.HashMap;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
import android.widget.Button;
public class DownloadTask extends AsyncTask<Integer, Integer, Void> {
private NotificationHelper mNotificationHelper;
public int position;
public ArrayList<HashMap<String, String>> list;
public DownloadTask(Context context,int position, ArrayList<HashMap<String, String>> list) {
mNotificationHelper = new NotificationHelper(context);
this.position = position;
this.list = list;
}
protected void onPreExecute() {
mNotificationHelper.createNotification();
}
@SuppressLint("NewApi")
@Override
protected Void doInBackground(Integer... integers) {
int count;
try {
URL url = new URL("http://myurl/test.zip");
URLConnection conection = url.openConnection();
conection.connect();
int lenghtOfFile = conection.getContentLength();
Log.d("Size: ", Integer.toString(lenghtOfFile));
InputStream input = new bufferedInputStream(url.openStream(),8192);
OutputStream output = new FileOutputStream(Environment.getExternalStorageDirectory().getPath()+ "/"+ list.get(position).get("Name") + ".zip");
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
publishProgress((int) ((total * 100)/lenghtOfFile));
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
} catch (Exception e) {
Log.e("Error: ", e.getMessage());
}
return null;
}
@Override
protected void onProgressUpdate(Integer... progress) {
mNotificationHelper.progressUpdate(progress[0]);
}
@Override
protected void onPostExecute(Void result) {
mNotificationHelper.completed();
}
}
Это, кажется, работает довольно хорошо, но когда я нажимаю на мою кнопку, чтобы запустить AsyncTask, всю систему замедляется, и использовать планшет невозможно, пока загрузка не будет завершена. (не очень полезно, когда zip 100mo).
Кроме того, я хотел бы сделать это, чтобы отменить загрузку, но когда я пытаюсь сделать это из своей основной деятельности (с чем-то вроде этого: MyAsynctask.cancel(true);
) сбой приложения. Поэтому я хотел бы знать, есть ли способ сделать это (возможно, из уведомления, чтобы дать лучший пользовательский опыт).
EDIT:
Проблема с отставанием решена, благодаря buptcoder с временем обновления менее важным:
while ((count = input.read(data)) != -1) {
total += count;
if ((count % 10) == 0) {
publishProgress((int) ((total * 100)/;lenghtOfFile));
}
output.write(data, 0, count);
}
Я до сих пор ищу способ отменить уведомление.
добавить аварии LogCat – Prachi