2016-10-26 11 views
1

私のアプリケーションでは、ファイルをクリックするとサーバーからダウンロードが開始され、進行状況は電話ステータスバーに表示されます。しかし、私はアプリケーション画面自体にプログレスバーを表示します。断片のダウンロード進捗ダイアログのための非同期タスクの使用方法?

私は、このリンクに続く: - 問題文を近づいている間、私はこれらのSYSTEM_DOWNLOADERに遭遇し、APP_DOWNLOADER

http://www.androidhive.info/2012/04/android-downloading-file-by-showing-progress-bar/

を。

  1. これらは正確に何ですか?

  2. 上記の例はアクティビティで呼び出されています。フラグメントのダウンロードプログレスバーでAsynchタスクを呼び出す方法を知りたかったのです。

私は明確化のために、質問を編集しています、私は、ファイルをクリックすると、アプリが強制stop.whatミスを与える

 convertView.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       MoodleModule module = listObjects.get(position).module; 
       if (module == null) 
        return; 
       Intent i = new Intent(context, AppBrowserActivity.class); 

       String modurl = module.getUrl(); 
       String courseurl = session.getmUrl() 
         + "/course/view.php?id=" + courseid; 
       modurl = (modurl == null) ? courseurl : modurl; 
       i.putExtra("url", modurl); 

       if (!module.getModname().contentEquals("resource")) { 
        context.startActivity(i); 
        return; 
       } 

       if (module.getContents() == null) { 
        context.startActivity(i); 
        return; 
       } 

       if (module.getContents().isEmpty()) { 
        context.startActivity(i); 
        return; 
       } 

       MoodleModuleContent content = module.getContents().get(0); 
       String path = "/s" + session.getCurrentSiteId() + "c" 
         + courseid + "/"; 
       File file = new File(Environment 
         .getExternalStoragePublicDirectory("/MDroid") 
         + path + content.getFilename()); 
       //TODO here 
       // Download if file doesn't already exist 
       if (!file.exists()) { 
        String fileurl = content.getFileurl(); 
        fileurl += "&token=" + session.getToken(); 
        fName=content.getFilename(); 

       //FROM HERE I AM CALLING ASYNCHRONOUS TASK 
        startDownload(); 


       } else { 
        FileOpener.open(context, file); 
       } 

      } 
     }); 

     return convertView; 
    } 

    private void startDownload() { 
     String url = "http://farm1.static.flickr.com/114/298125983_0e4bf66782_b.jpg"; 
     new DownloadFileAsync().execute(url); 
    } 

    protected Dialog onCreateDialog(int id) { 
     switch (id) { 
      case DIALOG_DOWNLOAD_PROGRESS: 
       mProgressDialog = new ProgressDialog(getActivity()); 
       mProgressDialog.setMessage("Downloading file.."); 
       mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
       mProgressDialog.setCancelable(false); 

       return mProgressDialog; 
      default: 
       return null; 
     } 
    } 
    class DownloadFileAsync extends AsyncTask<String, String, String> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

      /*mProgressDialog = new ProgressDialog(getActivity()); 
      mProgressDialog.setMessage("Downloading file."); 
      mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
      mProgressDialog.setCancelable(false); 
      mProgressDialog.show();*/ 
      /*showDialog(DIALOG_DOWNLOAD_PROGRESS);*/ 

      mProgressDialog.show(); 
     } 

     @Override 
     protected String doInBackground(String... aurl) { 
      int count; 
      /*String fName=content.getFilename();*/ 
      /*InputStream input = null; 
      OutputStream output = null;*/ 
      HttpURLConnection connection = null; 
      try { 

       URL url = new URL(aurl[0]); 
       URLConnection conexion = url.openConnection(); 
       conexion.connect(); 

       int lenghtOfFile = conexion.getContentLength(); 
       Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile); 

      /* File f = new File(Environment.getExternalStorageDirectory() 
        + "/sdcard/"); 
      f.mkdirs();*/ 

       InputStream input = new BufferedInputStream(url.openStream()); 
       OutputStream output = new FileOutputStream("/sdcard/some_photo_from_gdansk_poland.jpg"); 

       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) {} 
      return null; 

     } 
     protected void onProgressUpdate(String... progress) { 

      mProgressDialog.setProgress(Integer.parseInt(progress[0])); 
     /* mProgressDialog.dismiss();*/ 
     } 

     @Override 
     protected void onPostExecute(String unused) { 
     /*dismissDialog(DIALOG_DOWNLOAD_PROGRESS);*/ 
      mProgressDialog.dismiss(); 
     } 
    } 

私は

+0

ように私のフラグメント活動にDownloadTask.javaクラスファイルからこのダウンロード方法と呼ばれますあなたのファイルがダウンロードされるまで。 – Piyush

+0

だから私はこれらの2つの違いを知る必要がある –

+0

_DownloadManager_を使用すると、ファイルがダウンロードされるまで進捗状況が通知バーに表示され、 'AsyncTask'内で' ProgressBar'または 'ProgressDialog'を使用すると、 'AsyncTask'の' onPostExecuted() 'メソッド – Piyush

答えて

2
out.thanks私を助けてください??やって助けてください

私は自分自身で答えを見つけました。誰も助けてくれることを願っています。

私はasynchタスクを断片的に呼びたいと思っていましたが、ファイルのダウンロードの進行状況をパーセンテージで示す進捗状況を表示したかったのです。

>私はクラスで非同期タスクを呼び出しました。

DownloadTask.javaクラス

//This is important 
public DownloadTask(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.setCanceledOnTouchOutside(false); 
} 

@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
public void download(String fileUrl, String filepath, String fileName, 
        Boolean visibility, Boolean choice) { 
    // Make directories if required 
    this.fileUrl=fileUrl; 
    this.filepath=filepath; 
    this.fileName=fileName; 
    this.visibility=visibility; 
    File f = new File(
      Environment.getExternalStoragePublicDirectory("/MDroid") 
        + filepath); 
    if (!f.exists()) 
     f.mkdirs(); 


    if (choice == SYSTEM_DOWNLOADER) { 

     String url=fileUrl; 
     new MyAsyncTask().execute(url); 

    } else { 
     mdroidDownload(fileUrl, fileName); 
     reqId =0; 
    } 

} 

class MyAsyncTask extends AsyncTask<String, String, Void> { 

    boolean running; 


    @Override 
    protected Void doInBackground(String...fUrl) { 
     int count; 


     InputStream input = null; 
     OutputStream output = null; 
     HttpURLConnection connection = null; 
     try { 

      URL url = new URL(fUrl[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 

      int lenghtOfFile = connection.getContentLength(); 

      // download the file 
      input = connection.getInputStream(); 
      output = new FileOutputStream(
        Environment.getExternalStorageDirectory() + "/MDroid/" 
          + fileName); 

//################################# 

    mydownload(fileUrl, filepath, fileName, 
     visibility); 


//########################################## 

      byte data[] = new byte[4096]; 
      long total = 0; 
      while ((count = input.read(data)) != -1) { 
       total += count; 
       publishProgress(""+(int)((total*100)/lenghtOfFile)); 
       output.write(data, 0, count); 
      } 

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

    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     running = true; 

     mProgressDialog.show(); 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 

     mProgressDialog.dismiss(); 
    } 

    protected void onProgressUpdate(String... progress) { 

     // Update the progress dialog 
     mProgressDialog.setProgress(Integer.parseInt(progress[0])); 

    } 


} 




public long mydownload(String fileUrl,String filepath,String fileName,Boolean visibility) 
{ 
    DownloadManager manager = (DownloadManager) context 
      .getSystemService(Context.DOWNLOAD_SERVICE); 

/* TODO- Offer better alternative. Only a temporary, quick, 
* workaround for 2.3.x devices. May not work on all sites. 
*/ 
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) 
     fileUrl = fileUrl.replace("https://", "http://"); 
    Request request = new Request(Uri.parse(fileUrl)); 
    try { 
     request.setDestinationInExternalPublicDir("/MDroid", filepath 
       + fileName); 
    } catch (Exception e) { 
     Toast.makeText(context, "External storage not found!", 
       Toast.LENGTH_SHORT).show(); 
     return 0; 
    } 
    request.setTitle(fileName); 
    request.setDescription("MDroid file download"); 

    // Visibility setting not available in versions below Honeycomb 
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) 
     if (!visibility) 
      request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN); 
     else 
      request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 

    // -TODO- save this id somewhere for progress retrieval 
    reqId = manager.enqueue(request); 
    return reqId; 
} 

2>私はあなたが `ProgressBar`または` ProgressDialog`を使用することができ、この

// Download if file doesn't already exist 
       if (!file.exists()) { 
        fileurl = content.getFileurl(); 

        fileurl += "&token=" + session.getToken(); 
        fName = content.getFilename(); 

        //FROM HERE I AM CALLING ASYNCHRONOUS TASK 

        DownloadTask dt = new DownloadTask(context); 
        dt.download(fileurl, path, content.getFilename(), false, 
          DownloadTask.SYSTEM_DOWNLOADER); 


       } else { 

        FileOpener.open(context, file); 
       } 
関連する問題