2013-05-03 4 views
1

Я пытаюсь создать 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); 
} 

Я до сих пор ищу способ отменить уведомление.

+0

добавить аварии LogCat – Prachi

ответ

1

Вы обновляете уведомление слишком быстро. Вы должны уменьшить частоту обновления.

+0

Это похоже на работу с: (! (Кол = input.read (данные)) = -1) 'в то время как { \t общая + = кол; \t if ((count% 10) == 0) { \t \t publishProgress ((int *) ((всего * 100) /; lenghtOfFile)); \t} \t output.write (data, 0, count); } ', спасибо! – kom

0
new MyAsyncTask.DownloadTask(context, position,list).execute(0); 

У вас не было экземпляра класса, поэтому вы не можете его отменить.

MyAsyncTask myTask = new MyAsyncTask.DownloadTask(context, position,list); 
myTask.execute(0); 
myTask.cancel(true); 
+0

Я пробовал ваш пример, но myTask.cancel (true); не остановил мою AsyncTask, и уведомление все еще работает. Единственным хорошим моментом является то, что приложение не сбой. Может быть, есть способ прервать запрос html и выйти из задачи изнутри? – kom

Смежные вопросы