2012-06-06 4 views
8

Я знаю, что мы можем использовать встроенный менеджер загрузок в Android 2.3 и выше, но мое приложение подходит для Android 2.2 и выше. Мой вопрос в том, как создать собственный менеджер загрузок в Android 2,2? пожалуйста, предоставьте мне несколько ответов.Как создать собственный менеджер загрузок в android 2.2

ответ

27

, пожалуйста, предоставьте мне пример ответа.

Step1 Посмотрите для примера на Как загрузить файлы в Android

Шаг 2 Посмотрите для примера о том, как выполнять операции в AsyncTask.

Шаг3 Посмотрите пример того, как отображать результаты загрузки во время загрузки.

Step4 Посмотрите для примера о том, как отправить Выборочную Broadcast, когда задача выполнена

Step5 Посмотрите для примера на Как Упорство операции AsysncTask даже при повороте устройства

step6 Посмотрите на пример того, как показать прогресс загрузки в уведомлении.

Ниже приведен пример кода.

1. Используйте AsyncTask и показать ход загрузки в диалоговом

// declare the dialog as a member field of your activity 
ProgressDialog mProgressDialog; 

// instantiate it within the onCreate method 
mProgressDialog = new ProgressDialog(YourActivity.this); 
mProgressDialog.setMessage("A message"); 
mProgressDialog.setIndeterminate(false); 
mProgressDialog.setMax(100); 
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 

// execute this when the downloader must be fired 
DownloadFile downloadFile = new DownloadFile(); 
downloadFile.execute("the url to the file you want to download"); 

The AsyncTask will look like this: 

// usually, subclasses of AsyncTask are declared inside the activity class. 
// that way, you can easily modify the UI thread from here 
private class DownloadFile extends AsyncTask<String, Integer, String> { 
    @Override 
    protected String doInBackground(String... sUrl) { 
     try { 
      URL url = new URL(sUrl[0]); 
      URLConnection connection = url.openConnection(); 
      connection.connect(); 
      // this will be useful so that you can show a typical 0-100% progress bar 
      int fileLength = connection.getContentLength(); 

      // download the file 
      InputStream input = new BufferedInputStream(url.openStream()); 
      OutputStream output = new FileOutputStream("/sdcard/file_name.extension"); 

      byte data[] = new byte[1024]; 
      long total = 0; 
      int count; 
      while ((count = input.read(data)) != -1) { 
       total += count; 
       // publishing the progress.... 
       publishProgress((int) (total * 100/fileLength)); 
       output.write(data, 0, count); 
      } 

      output.flush(); 
      output.close(); 
      input.close(); 
     } catch (Exception e) { 
     } 
     return null; 
    } 

выше метод (doInBackground) работает всегда в фоновом потоке. Вы не должны выполнять какие-либо задачи пользовательского интерфейса. С другой стороны, onProgressUpdate и onPreExecute работать в потоке пользовательского интерфейса, так что вы можете изменить индикатор:

@Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     mProgressDialog.show(); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... progress) { 
     super.onProgressUpdate(progress); 
     mProgressDialog.setProgress(progress[0]); 
    } 
} 

2. Скачать с Service

Большой вопрос состоит в следующем: как сделать Я обновляю свою активность из службы ?. В следующем примере мы собираемся использовать два класса, о которых вы, возможно, не знаете: ResultReceiver и IntentService. ResultReceiver - это тот, который позволит нам обновить наш поток из службы; IntentService - это подкласс Сервиса, который генерирует поток для выполнения фоновой работы (вы должны знать, что Служба работает на самом деле в том же потоке вашего приложения, когда вы расширяете Сервис, вы должны вручную создавать новые потоки для выполнения операций блокировки ЦП) ,

Скачать Сервис может выглядеть следующим образом:

public class DownloadService extends IntentService { 
    public static final int UPDATE_PROGRESS = 8344; 
    public DownloadService() { 
     super("DownloadService"); 
    } 
    @Override 
    protected void onHandleIntent(Intent intent) { 
     String urlToDownload = intent.getStringExtra("url"); 
     ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver"); 
     try { 
      URL url = new URL(urlToDownload); 
      URLConnection connection = url.openConnection(); 
      connection.connect(); 
      // this will be useful so that you can show a typical 0-100% progress bar 
      int fileLength = connection.getContentLength(); 

      // download the file 
      InputStream input = new BufferedInputStream(url.openStream()); 
      OutputStream output = new FileOutputStream("/sdcard/BarcodeScanner-debug.apk"); 

      byte data[] = new byte[1024]; 
      long total = 0; 
      int count; 
      while ((count = input.read(data)) != -1) { 
       total += count; 
       // publishing the progress.... 
       Bundle resultData = new Bundle(); 
       resultData.putInt("progress" ,(int) (total * 100/fileLength)); 
       receiver.send(UPDATE_PROGRESS, resultData); 
       output.write(data, 0, count); 
      } 

      output.flush(); 
      output.close(); 
      input.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     Bundle resultData = new Bundle(); 
     resultData.putInt("progress" ,100); 
     receiver.send(UPDATE_PROGRESS, resultData); 
    } 
} 

Добавить услугу в манифесте:

<service android:name=".DownloadService"/> 

И деятельность будет выглядеть следующим образом:

// инициализировать диалог выполнения как в первом примере

// это то, как вы запускаете загрузчик

mProgressDialog.show(); 
Intent intent = new Intent(this, DownloadService.class); 
intent.putExtra("url", "url of the file to download"); 
intent.putExtra("receiver", new DownloadReceiver(new Handler())); 
startService(intent); 

Здесь есть были ResultReceiver приходит играть:

private class DownloadReceiver extends ResultReceiver{ 
    public DownloadReceiver(Handler handler) { 
     super(handler); 
    } 

    @Override 
    protected void onReceiveResult(int resultCode, Bundle resultData) { 
     super.onReceiveResult(resultCode, resultData); 
     if (resultCode == DownloadService.UPDATE_PROGRESS) { 
      int progress = resultData.getInt("progress"); 
      mProgressDialog.setProgress(progress); 
      if (progress == 100) { 
       mProgressDialog.dismiss(); 
      } 
     } 
    } 
} 
+0

Спасибо за ответ. Я попробую это. –

+3

Если он решает вашу проблему, не забудьте принять ответ, поскольку он поможет другим пользователям, –

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