2015-08-21 60 views
0

我的應用程序中有一個進度條。我正在調用一個意向服務來下載大文件。進度條在服務開始下載時正確更新。當我從設備上點擊後退按鈕時,意圖服務仍在後臺運行,並且進度條計數也在後臺更新,但是當我再次打開該應用程序時,即使進度條計數從何處開始,進度條也沒有更新該值我離開了。你能幫我解決這個問題嗎?當單擊後退按鈕時進度條沒有更新值

這是具有在佈局文件中的進度條IM,

<ProgressBar 
    android:id="@+id/progressBar2" 
    style="?android:attr/progressBarStyleHorizontal" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 

    android:layout_marginTop="20dp" 
    android:indeterminate="false" 
    android:max="100" 
    android:minHeight="50dp" 
    android:minWidth="200dp" 
    android:progress="1" /> 

這是我的java文件,其中IM更新進度。進度意圖將具有當前的進度更新計數。

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    sharedPref = getPreferences(Context.MODE_PRIVATE); 
    progressBar2 = (ProgressBar) findViewById(R.id.progressBar2); 
    updateReceiver = new CheckNetworkConnectivity(
      new NetworkReceiverCallback() { 
       @Override 
       public void onNetworkReceived(int status) { 
        networkStaus = status; 
        if (networkStaus == 0) { 

         Toast.makeText(
           getApplicationContext(), 
           "Download interrupted due to network issue.", 
           Toast.LENGTH_SHORT).show(); 

        } else { 
         onCallService(fileLength, currentDate, downloaded, Constants.downloadStatus); 
         Toast.makeText(getApplicationContext(), 
            "Start downloading....", 
            Toast.LENGTH_SHORT).show(); 
        } 
       } 
      }); 

    registerReceiver(updateReceiver, new IntentFilter(
     ConnectivityManager.CONNECTIVITY_ACTION)); 

    activity = this; 

} 

private void onCallService(long downloaded, String lastModifiedDate, long size, int downloadStatus) { 
    mReceiver = new DownloadResultReceiver(new Handler()); 
    mReceiver.setReceiver(this); 
    Intent intent = new Intent(Intent.ACTION_SYNC, null, this, 
      DownloadBackgroundService.class); 

    String url = ""; 

    intent.putExtra("url", url); 
    intent.putExtra("receiver", mReceiver); 
    intent.putExtra("downloaded", downloaded); 
    intent.putExtra("downloadStatus", downloadStatus); 
    intent.putExtra("size", size); 
    intent.putExtra("lastModifiedDate", lastModifiedDate); 

    startService(intent); 

} 

@Override 
public void onReceiveResult(int resultCode, Bundle resultData) { 
    int progress = resultData.getInt("progress"); 
    progressBar.setProgress(progress); 
    progressBar.setMax(100); 
    progressBar.setText(String.valueOf(progress) + "/100"); 
    progressBar2.invalidate(); 
    progressBar2.setProgress(progress); 
    progressBar2.isFocused(); 
    Log.d("DownloadService", "Progress bar is updating : " + progress); 
} 

@Override 
protected void onStart() { 

    progressBar = (TextProgressBar) findViewById(R.id.progressBar1); 
    progressBar.setProgress(0); 
    progressBar.setMax(100); 

    progressBar.setText(String.valueOf(0) + "/100"); 
    super.onStart(); 
} 

@Override 
protected void onRestart() { 

    super.onRestart(); 
} 

@Override 
protected void onResume() { 

    super.onResume(); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    unregisterReceiver(updateReceiver); 
} 
+0

發佈您的完整Java代碼將更好地幫助 –

+0

已添加@PhanDinhThai – Ravi

回答

0

請更改:

android:layout_width="wrap_content"

android:layout_width="match_parrent"

+0

試過。但沒有運氣。 – Ravi

0

如果你能看到在日誌中修改後的值,如果只有它的輸出不可見,嘗試progressBar.invalidate();

+0

不工作。我可以看到修改後的值,但仍在進度條中更新 – Ravi

+0

在您的代碼中,您先失效並設置進度。請檢查。 – Ankita

+0

我嘗試過,但不工作 – Ravi

0

先來看看下面的活動生命週期: enter image description here

當我打開應用程序再次進度欄沒有更新,即使進度計數從我離開那裏開始值

當您通過點擊返回按鈕退出應用程序時,屬於活動的每個資源都將被銷燬。然後當你再次打開應用程序時,你的資源將被重新提供。這意味着當您再次打開應用時,當您撥打電話時,您的進度條將作爲新實例初始化progressBar2 = (ProgressBar) findViewById(R.id.progressBar2);

我建議的解決方案是,每次收到下載進度的值時,將其保存到數據庫或首選項中,你打開應用程序:

@Override 
public void onReceiveResult(int resultCode, Bundle resultData) { 
int progress = resultData.getInt("progress"); // <---- SAVE THIS VALUE 
progressBar.setProgress(progress); 
progressBar.setMax(100); 
progressBar.setText(String.valueOf(progress) + "/100"); 
progressBar2.invalidate(); 
progressBar2.setProgress(progress); 
progressBar2.isFocused(); 
Log.d("DownloadService", "Progress bar is updating : " + progress); 
} 


@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

sharedPref = getPreferences(Context.MODE_PRIVATE); 
progressBar2 = (ProgressBar) findViewById(R.id.progressBar2); 
progressBar2.setProgress(progress); // GET SAVED VALUE AND SET IT INTO PROGRESS 
+0

但int progress = resultData.getInt(「progress」); // <----在日誌中保存這個值即使我點擊後退按鈕 – Ravi

+0

yes也可以正確打印進度值,這就是爲什麼您應該保存該值。當您點擊後,進度不再存在 –

+0

其工作正常whan我再次打開應用程序。它以相同的百分比值顯示了我離開時的進度欄。但它不會更新onReceiveResult方法中的值。任何想法? – Ravi

0

錯誤的線程。 「onReceiveResult」是一個異步事件,即可能不會在UI線程中。 使用mActivity.runOnUiThread更新您的用戶界面。