2016-08-01 2 views
0

私はまだ最初のアプリケーションを作ろうとしています。それで、それは成長します...そして、私はいくつかのPackegesにそれを分割しようとします。 私の最初のパックはファイルで動作し、ファイルのダウンロード、ファイルからのデータの読み取りなどを行うクラスを含みます。Android:別のパックからのアクティビティで非同期タスクからProgressDailogを表示するにはどうすればいいですか?

私は主なアクティビティのファーストクラスから移動しようとしますが、ProgressDialogに問題があり、動作しません。だから私はいくつかのqwestionsを持っています:

1)私のアプリケーションの活動にダウンロードの%を送信する最良の方法は何ですか? 2)ダウンロードの進行中にユーザーが現在のアクティビティを変更した場合はどうなりますか?

package com.domen.myapplication.Files; 

import android.app.ProgressDialog; 
import android.content.Context; 
import android.os.AsyncTask; 
import android.os.PowerManager; 
import android.widget.Toast; 


import com.domen.myapplication.R; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 

/** 
* Created by DL on 01.08.2016. 
*/ 
public class DownloadTask extends AsyncTask<String, Integer, String> { 

    private Context context; 
    private PowerManager.WakeLock mWakeLock; 
    public int progress=0; 
    public int progressShow=0; 
    public ProgressDialog mProgressDialog; 




    public DownloadTask(Context context) { 
     this.context = context; 

     mProgressDialog = new ProgressDialog(this.context); 
     mProgressDialog.setMessage(this.context.getResources().getString(R.string.loading_empty)); 
     mProgressDialog.setIndeterminate(true); 
     mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     mProgressDialog.setCancelable(true); 


    } 

    @Override 
    protected String doInBackground(String... sUrl) { 
     InputStream input = null; 
     OutputStream output = null; 
     HttpURLConnection connection = null; 
     try { 
      URL url = new URL(sUrl[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 

      // expect HTTP 200 OK, so we don't mistakenly save error report 
      // instead of the file 
      if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { 
       return "Server returned HTTP " + connection.getResponseCode() 
         + " " + connection.getResponseMessage(); 
      } 

      // this will be useful to display download percentage 
      // might be -1: server did not report the length 
      int fileLength = connection.getContentLength(); 

      // download the file 
      input = connection.getInputStream(); 
      //output = new FileOutputStream("/sdcard/file_name.extension"); 


      File cacheFile = new File(this.context.getCacheDir(), "FIRMWARE"); 

      output = new FileOutputStream(cacheFile); 

      byte data[] = new byte[4096]; 
      long total = 0; 
      int count; 
      while ((count = input.read(data)) != -1) { 
       // allow canceling with back button 
       if (isCancelled()) { 
        input.close(); 
        return null; 
       } 
       total += count; 
       // publishing the progress.... 
       if (fileLength > 0) // only if total length is known 
        publishProgress((int) (total * 100/fileLength)); 
       output.write(data, 0, count); 
      } 
     } catch (Exception e) { 
      return e.toString(); 
     } finally { 
      try { 
       if (output != null) 
        output.close(); 
       if (input != null) 
        input.close(); 
      } catch (IOException ignored) { 
      } 

      if (connection != null) 
       connection.disconnect(); 
     } 
     return null; 
    } 


    //метод выше (doInBackground) запускается отдельным поток все сотальное ниже в главном потоке 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     // take CPU lock to prevent CPU from going off if the user 
     // presses the power button during download 
     PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
     mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
       getClass().getName()); 
     mWakeLock.acquire(); 
     progressShow=1; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... progress) { 
     super.onProgressUpdate(progress); 
     // if we get here, length is known, now set indeterminate to false 
     mProgressDialog.setIndeterminate(false); 
     mProgressDialog.setMax(100); 
     mProgressDialog.setProgress(progress[0]); 
     this.progress=progress[0]; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     mWakeLock.release(); 
     progressShow=1; 
     mProgressDialog.dismiss(); 
     if (result != null) 
      Toast.makeText(context, "Download error: " + result, Toast.LENGTH_LONG).show(); 
     else 
      Toast.makeText(context, "File downloaded", Toast.LENGTH_SHORT).show(); 
    } 


} 

答えて

1

アクティビティでのみファイルをダウンロードする場合は、アクティビティの内部クラスとしてAsyncTaskを作成して使用します。

アクティビティに関係なくファイルをダウンロードしたい場合は、サービスを作成してサービスにダウンロードロジックを実装し、サービスからファイルダウンロードの進捗状況を表示し、ダウンロード率を更新します。

2番目の質問ダウンロードの進行中にユーザーが現在のアクティビティを変更するとどうなりますか?

はい、非同期タスクは、アクティビティが破棄されてもジョブが終了するまで実行されます。詳細については、このリンクを確認してくださいhttps://stackoverflow.com/a/13147992/1066839

+0

ああ、これは素晴らしい助けです!ありがとう! 私はすでに自分のアプリケーションに1つのサービスを持っています。ユーザーが現在の活動を変更すると、サービスは機能しますか?私は新しい活動からそれを再結びつける必要がありますか? 私のアプリケーションでは、私は1つのアクティビティしか持たず、ViewFlipperの変更画面の助けを借りています(しかし、これは悪い考えですか?) –

+0

サービスが既にある場合。サービス内にスレッドを作成し、サービスを開始してファイルをダウンロードし、ファイルの進行状況の通知を表示します。 – John

+0

私のサービスはBluetooth接続を管理しています。そして私はもう一つのサービスが必要だと思います...それは正しいですか? –

関連する問題