0

ダウンロード マネージャー アプリを作成したいのですがactivity、ユーザーに現在の進行状況を示す進行状況バーを追加します。ユーザーが [戻る] ボタンを押してactivityもう一度開くと、これProgressBarは更新されません。

この問題を回避するために、ダウンロードごとに一意の名前を持つ単一のスレッドを作成し、進行状況を実行可能に保ち、そのスレッドがonResume関数で実行されているかどうかを確認し、現在のスレッドに複製して新しいスレッドを再実行しますが、私のUIも更新しません。アイデアはありますか!?

@Override
public void onResume() 
{
    super.onResume();
    Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
    Thread[] threadArray = threadSet.toArray(new Thread[threadSet.size()]);
    for (int i = 0; i < threadArray.length; i++)
        if (threadArray[i].getName().equals(APPLICATION_ID))
        {
            mBackground = new Thread(threadArray[i]);
            mBackground.start();
            downloadProgressBar.setVisibility(View.VISIBLE);
            Toast.makeText(showcaseActivity.this
                    , "Find that thread - okay", Toast.LENGTH_LONG).show();
        }
}

private void updateProgressBar()
{
    Runnable runnable = new updateProgress();
    mBackground  = new Thread(runnable);
    mBackground.setName(APPLICATION_ID);
    mBackground.start();
}

private class updateProgress implements Runnable
{
    public void run() 
    {
        while (Thread.currentThread() == mBackground)
            try 
            {
                Thread.sleep(1000); 
                Message setMessage = new Message();
                setMessage.what = mDownloadReceiver.getProgressPercentage();        
                mHandler.sendMessage(setMessage);
            }
            catch (InterruptedException e) 
            {
                Thread.currentThread().interrupt();
            } 
            catch (Exception e) 
            {/* Do Nothing */}
    }
}

private Handler mHandler = new Handler()
{
    @Override
    public void handleMessage(Message getMessage) 
    {
        downloadProgressBar.setIndeterminate(false);
        downloadProgressBar.setProgress(getMessage.what);
        if (getMessage.what == 100)
            downloadProgressBar.setVisibility(View.GONE);
    }
};

ダウンロード ボタンのコード:

downloadBtn.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(View arg0) 
    {
        downloadProgressBar.setVisibility(View.VISIBLE);
        downloadProgressBar.setIndeterminate(true);
        downloadProgressBar.setMax(100);    
        Intent intent = new Intent(showcaseActivity.this, downloadManagers.class);
        intent.putExtra("url", "http://test.com/t.zip");
        intent.putExtra("receiver", mDownloadReceiver);
        startService(intent);
        updateProgressBar();
    }
});
4

1 に答える 1

2

Painless Threadingに関する Android 開発者のブログ投稿を読むことを強くお勧めします。述べられているように、別のスレッドから UI を更新する最も簡単な方法は、Activity.runOnUiThreadを使用することです。

于 2013-03-09T00:21:54.030 に答える