2015-08-21 23 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更新您的用户界面。