2012-02-10 8 views
1

URLからファイルをダウンロードしようとしています。ダウンロードが失敗した場合(理由にかかわらず)、アプリケーションは1時間後に再試行します。メインスレッドにないときにCountDownTimerを実行する方法

ダウンロードは自分のスレッド(メインスレッドではない)になっているので、私は新しいCountDownTimerを開始することはできません。

ダウンロードスレッドをブロックしたくないので、私はCountDownTimerを使用しようとしています。

これを行う別の方法はありますか?

ありがとうございます!

private class Downloader extends AsyncTask<Object, Void, File> 
{ 

    @Override 
    protected File doInBackground(Object... params) 
    { 
     Context context = (Context) params[0]; 
     String strUrl = (String) params[1]; 
     String strFileName = (String) params[2]; 
     return download(context, strUrl, strFileName); 
    } 


    /** 
    * Downloads files in a separate thread. Adds notification of download to status bar. 
    */ 
    public File download(final Context context, final String url, final String fileName) 
    { 
     boolean isVideoLoaded=false; 
      try 
      {     
        URL urlObj = new URL(url); 
        URLConnection con = urlObj.openConnection(); 
        BufferedInputStream bis = new BufferedInputStream(con.getInputStream(), BUFFER_SIZE); 

        FileOutputStream fos = new FileOutputStream(retFile); 
        byte[] bArray = new byte[BUFFER_SIZE]; 
        int current = 0; 
        int read = 0; 
        while(current != -1) 
        { 
         fos.write(bArray,0,current); 
         current = bis.read(bArray, 0, BUFFER_SIZE); 
         read = read + current; 

        } 
        fos.close(); 
        bis.close(); 
        isVideoLoaded = true; 

       strFileName = retFile.getAbsolutePath(); 
      } 
      catch(Exception ioe) 
      { 
       Log.d("Downloader.download", "Error: " + ioe.toString(), ioe); 

      } 
     } 
     if (!isVideoLoaded) // if video is still not loaded 
     { 
      // sleep then try again 
      new CountDownTimer(15000, 2000) 
      { 

       public void onFinish() 
       { 

         Downloader dh = new Downloader(); 

         Object params[] = new Object[3]; 
         params[0] = context; 
         params[1] = url; 
         params[2] = fileName;*/ 

         dh.execute(params);  
       } 

       @Override 
       public void onTick(long millisUntilFinished) { 
        // TODO Auto-generated method stub 
       } 
      }.start(); 
     } 
     return retFile; 

    } 


    protected void onPostExecute(File file) { 
      // display downloaded file 
    } 

答えて

1

を待ちます。あなたのUIクラスで 、あなたのダウンローダonPostExecute(でこの機能を使用

private StartOneHourTimer() 
{ 
new CountDownTimer(10000 * 3600, 1000) { 
    public void onTick(long millisUntilFinished) { 
     mTextField.setText("seconds remaining: " + millisUntilFinished/1000); 
    } 
    public void onFinish() { 
     m_downloader = new Downloader(..); 
     m_downloader.execute(..); 
    } 
    }.start(); 
} 

)、1時間で期限切れとなる新しいタイマーを開始し 。

protected void onPostExecute(File file) 
    { 
     if (!isVideoLoaded) 
      startOneHourTimer(); 
     else 
      //Call your normal UI code here 
    } 
0
変更

あなたのそれは(あなたができる(MyMainActivity.this.someMethod()によってそれに得ることができる必要があります。)主な活動は、新しいAsyncTaskを作ることができ、ダウンロードが失敗したことを意味するために戻ってメインの活動に出て呼び出すようにonPostExecute古いものを再使用しない)、開始を遅らせるべきであることを示します。

AsyncTaskに遅延パラメータを渡すことができるようにAsyncTaskにコンストラクタを追加すると、AsyncTaskはdoInBackgroundメソッドの一部として遅延パラメータを使用できます。 doInBackgroundインサイド

単にあなたのUIスレッドでのダウンロードを開始しますタイマーを作成することができますThread.sleep()

関連する問題