2013-08-14 3 views
0

다른 인기있는 앱의 캐시 정리 프로그램 인 첫 번째 Android 앱에서 작업하고 있습니다. 마침내 앱 캐시를 확인한 다음 삭제하는 기능이 있습니다. 그러나 파일을 삭제하기 위해 설정 한 비동기 작업은 진행률 막대를 정확하게 업데이트하지 않는 것 같습니다. 내가 프로그래밍 n00b이기 때문에, 내 코드는 대부분 다른 소스의 copypasta입니다.진행 표시 줄이 매우 정확하지 않습니다.

여기에 내가 의심 블록이 진행 바 계산 문제를 가지고있어하십시오 불필요 경우에만 디렉토리를 통해 이동을 필요로 루프에 대한 중첩 된 것처럼 것 같다

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

     // Delete Cache !! 
     File dir = new File(Environment.getExternalStorageDirectory() 
       + "/Android/Data/com.popularapp/Cache"); 

     // Progress Bar 
     for (int i = 1; i < 100; i++) { 
      if (isCancelled()) { 
       break; 
      } else { 
       System.out.println(i); 
       publishProgress(i); 
       if (dir.isDirectory()) { 
        String[] children = dir.list(); 
        for (int i2 = 0; i2 < children.length; i2++) { 
         new File(dir, children[i2]).delete(); 
        } 
       } 
      } 
     } 

     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 
     progressBar.setProgress(values[0]); 
     tvLoading.setText("Loading... " + values[0] + " %"); 
     tvPer.setText(values[0] + " %"); 
    } 
+0

for 루프를 콘솔에 인쇄 할 때 각 반복마다 해당 번호가 정확합니까? – Tonithy

+0

그 종류의 루프 출력을 콘솔에서 확인하는 방법을 알아 내야했지만, 추가 검사를 수행 할 때마다 각 반복을 올바르게 계산하는 것처럼 보입니다. 나는 바깥 고리를 제거했다. btw. –

답변

1

. 실제로 파일을 삭제하는 for 루프 반복에 진행 상황을 연결해야합니다.

바깥 쪽 루프는이고 'i2'카운터 변수를 사용하여 진행률을 게시 할 수 있습니다.

for 루프를 두 번째 (처음으로) for 루프로 호출하면 publishProgress (i2/children.length * 100)가 호출됩니다. 모든 파일의 삭제에 거의 같은 시간이 소요된다고 가정 할 때 더 정확한 숫자 여야합니다.

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

    // Delete Cache !! 
    File dir = new File(Environment.getExternalStorageDirectory() 
      + "/Android/Data/com.popularapp/Cache"); 
    if (dir.isDirectory()) { 
     String[] children = dir.list(); 
     for (int i2 = 0; i2 < children.length; i2++) { 
       if (isCancelled()) break; 
       int progress = 100 * i2/children.length; 
       Log.w("Deleting files...", "Current iteration: " + i2 + " Progress: " + progress); 
       publishProgress(progress); 
       new File(dir, children[i2]).delete(); 
     } 
    } 

    return null; 
} 
+1

# 1 : 아니오. 변수 'i'는 중첩 된 for-loop에서 사용되지 않습니다. 100 번 처리되는 디렉터리는 하나뿐입니다. – Vikram

+0

'ProgressBar는 float을 허용합니다. ' 나는 그렇게 생각하지 않는다. [링크] (http://developer.android.com/reference/android/widget/ProgressBar.html#setProgress%28int%29). – Vikram

+0

@vikram 일단 내가 # 3에 도달하면 그것을 알아 낸 것입니다. 나는 그 디렉토리와 임의의 (100), 그러나 특정한 양의 시간을 읽을 특별한 이유를 상상할 수 없다. – Tonithy

관련 문제