2017-07-18 30 views
0

私はasyncTaskを使用してダウンロードの進行状況を表示しています。私の主なアクティビティでは "file-downloader"という名前のライブラリでダウンロードが行われます。 私は私の指定されたボタンにクリックして、タスクをダウンロードするとき、それはgithubのページの「https://github.com/wlfcolin/file-downloaderasyncTask onProgressUpdateが2回目の起動時に動作しません

私のカスタムダイアログが表示され、プログレスバーは、私は、このカスタムダイアログ にダウンロードボタンを押したときに、すべてのものはOKで、プログレスバーが正常に動作を開始します。

このダイアログを閉じてもう一度このダイアログを呼び出すと、progressBarは機能しません。 私はfileDownloaderライブラリリスナーを使用してデータベースにダウンロードステータスを保存し、データベースから読み取ったカスタムダイアログを呼び出します。 downloadProgressが現在実行されていますが、カスタムダイアログのprogressBarに変更はありません。

アクティビティコード

public class MainActivity extends AppCompatActivity { 


    /* 
    /
    /some variables 
    /
    */ 

    public static int downloadedFile2SizePercent = 0 ; // downloaded file percent 
    public static int downloadingFileStatus = 0; // downloading status 
    Button myBtn ; 
    DownloadDialog dd; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main2); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    myBtn = (Button)findViewById(R.id.button22); 
    myBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      dd = new DownloadDialog(mContext,1); 
      dd.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 
      dd.show(); 
     } 
    }); 

    /* 
    /downloadingFileStatus value manages here by file downloader listeners correctly and saves as static variable and also in database 
    /downloadedFile2SizePercent value manages here by file downloader listeners correctly and saves as static variable 
    /
    */ 

    } 


} 

DownloadDialogクラス

public class DownloadDialog extends Dialog implements View.OnClickListener{ 

public Context c; 
public Button download, delete; 
private ProgressBar pb; 
ProgressTask progressTask; 
private int downloadStatus; 
private String downloadLink; 
private int downloadID 

public DownloadDialog(Context a, int downloadId) { 
    super(a); 
    this.c = a; 
    this.downloadId = downloadId 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.download_dialog); 
    download = (Button) findViewById(R.id.downloaddialot_downloadbtn); 
    delete = (Button) findViewById(R.id.downloaddialot_deletebtn); 
    download.setOnClickListener(this); 
    delete.setOnClickListener(this); 

    pb = (ProgressBar)findViewById(R.id.progressBar); 
    pb.setMax(100); 
    pb.setProgress(0); 

    //database is opend at mainActivity it's static 
    downloadStatus=Integer.parseInt(MainActivity.prDb.intSearch(downloadId));// detects download status --> 0 is "notDownloadedYet" and 
    // 1 is "downloading" and 2 is "downloaded" 
    downloadLink= MainActivity.puDb.intSearch(downloadId);//detects download link 

    progressTask = new ProgressTask(); 


    if(downloadStatus==1){ 
      pb.setProgress(MainActivity.downloadedFile2SizePercent);//this code line works every 2nd and after dialog invoking 
      progressTask.execute(true); 
      Toast.makeText(c,"test task progress for 2nd started", Toast.LENGTH_SHORT).show();//this code line works every 2nd and afterdialog invoking 
    } 

} 

@Override 
public void onClick(View v) { 

    switch (v.getId()) { 
     case R.id.downloaddialot_downloadbtn: 
        FileDownloader.start(downloadLink); // download task starts here 
        progressTask.execute(true); 
        Toast.makeText(c,"download task progress for 1nd started", Toast.LENGTH_SHORT).show(); 
      break; 

     case R.id.downloaddialot_deletebtn: 
      if(downloadStatus==2){ 
       // delete codes 
      } 
      break; 
    } 
} 


public class ProgressTask extends AsyncTask<Boolean, Integer, Boolean> { 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected Boolean doInBackground(Boolean... params) { 

     while (MainActivity.downloadedFile2SizePercent!=100){ 
       publishProgress(MainActivity.downloadedFile2SizePercent); 
     } 
     if(MainActivity.downloadedFile2SizePercent==100){ 
      publishProgress(MainActivity.downloadedFile2SizePercent); 
     } 

     return true; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     pb.setProgress(values[0]); 
    } 

    @Override 
    protected void onPostExecute(Boolean aBoolean) { 
     super.onPostExecute(aBoolean); 
     downloadStatus=2; //also saves in database by download listeners in mainActivity 
    } 

} 

} 

答えて

0

だけで、他のUI要素のようなプログレスバーは、管理またはメインUIスレッドから更新することができます。

このタスクでは、AsyncTaskで実行する必要がある作業が時間がかかる場合は、進行状況を揮発性変数に保存してから、UIスレッドが揮発性変数を読み取るプログレスバーを定期的に更新できますタイマーを使用します。

+0

あなたは、カスタムダイアログで行われたasynctaskによってプログレスバーが管理できないと言っていますか?だから、私はそれが動作するfirsダイアログのために言った! – roz

+0

私はあなたのコードをよく理解していません。 OOPの視点から見れば、悪いデザインに見えます。あなたは静的な使用を避けるべきです。ダイアログには情報が表示され、それ以外のものは表示されず、コード内にはダイアログが主要な部分を占めているようです。 –

0

あなたがここにすべてについてAsyncTaskを読むことができます:https://developer.android.com/reference/android/os/AsyncTask.html

しかし、ここでは、私の簡単な例/チュートリアルです:

private class MyAsyncTask extends AsyncTask<Void, Integer, Void> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     // prepare your UI for the background task beginning 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     // do some long-running task... 

     // you can do partial updates like: 
     publishProgress(25); 
     /* more hard work */ 
     publishProgress(50); 
     /* even more hard work */ 
     publishProgress(75); 

     // and when you're done... 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 
     // update your UI with the current progress (values[0]) 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
     // update your UI now that it's done 
    } 
} 

AsyncTaskについて理解するための重要な概念がdoInBackground()を除くすべてのメソッドが上で実行されていることですUIスレッド(メインスレッド)。つまり、これらの呼び出しからUIを自由に更新することができます。ただし、別のスレッドで実行されます。

doInBackground()つまり、アプリのユーザーインターフェースを遅くすることなく高価な作業を行うことができます。

もちろん、そのバックグラウンドスレッドでやっている作業は、何とかUIスレッドに何らかの形で(つまり、使用できるように)行う必要があります。これはpublishProgress()returnの文がdoInBackground()のものです。 publishProgress(someValue)に電話すると、onProgressUpdate(someValue)が呼び出されます。 return someValueと入力すると、システムによってonPostExecute(someValue)が呼び出されます。

関連する問題