无法使用Handler更新搜索栏

时间:2014-12-03 05:52:29

标签: android android-view ui-thread android-runonuithread

我正在尝试更新关于MediaPlayer中歌曲进度的搜索栏。 我正在使用Thread来完成这项任务。

首先,我使用Thred内部线程并尝试更新UI,但它崩溃了应用程序并说只有原始线程可以附加到视图。

然后我尝试用线程runnable中的处理程序更新它。哪个工作正常,但它没有更新搜索栏。当我做日志然后我知道循环不会进入我的处理程序。我不知道问题出在哪里。请帮我更新SeekBar。

代码:

private Runnable mUpdateTimeTask = new Runnable() {
    public void run() {
        try {
            if ((musicPath != mIRemoteService.getPath())) {
                System.out.println("..... MUSIC CHANGE.....");
                setOrUpdateData();
                updateFragmentLayout();     

            }

            // Displaying Current Duration time/Progress

            new Handler().post(new Runnable() {
                @Override
                public void run() {
                    try {
                        songCurrentDurationLabel.setText(""+ Utilities.milliSecondsToTimer(mIRemoteService.position()));
                        songProgressBar.setProgress((int)mIRemoteService.position());
                        System.out.println("Runnnnn.........");
                        //songProgressBar.invalidate();
                    } catch (RemoteException e) {
                        e.printStackTrace();
                        System.out.println("Runnnnn......... EXCEPTION....");
                    }

                }
            });
            System.out.println("Runnnnn.........MAIN....");

            if (!(mIRemoteService.isPlayerRunning())) {
                btnPlay.setImageDrawable(getResources().getDrawable(R.drawable.play_now_playing));
                mHandler.removeCallbacks(mUpdateTimeTask);
                System.out.println("Runnnnn.........MAIN....IF");

            }else{
                System.out.println("Runnnnn.........MAIN....ELSE");
                mHandler.post(mUpdateTimeTask);     
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
};

1 个答案:

答案 0 :(得分:3)

您可以使用处理程序或线程,使用线程,您应该确保在UI线程上发布修改:

private class UpdateSeekBar extends Thread
{
    @Override
    public void run()
    {
        super.run();

        while (null != mp && mp.isPlaying() && this.isAlive())
        {
            //final int min = (mp.getCurrentPosition() / 1000) / 60;
            //final int sec = (mp.getCurrentPosition() / 1000) % 60;

            MainActivity.this.runOnUiThread(new Runnable()
            {
                @Override
                public void run()
                {
                    try
                    {
                        songCurrentDurationLabel.setText("" + Utilities.milliSecondsToTimer(mIRemoteService.position()));
                        songProgressBar.setProgress((int) mIRemoteService.position());
                        System.out.println("Runnnnn.........");
                        // songProgressBar.invalidate();
                    }
                    catch (RemoteException e)
                    {
                        e.printStackTrace();
                        System.out.println("Runnnnn......... EXCEPTION....");
                    }
                }
            });

            try
            {
                Thread.sleep(1000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }
}