0

TextViews2 つのtxtName と textEndNameを更新しようとしています。デバッグすると、テキストが更新されることがありますが、残りの時間は機能しません。時々それは動作しますが、想定どおりではありません.以下のコードの問題は何ですか?

    txtName = (TextView) findViewById(R.id.txtstarttag);
    textEndName = (TextView) findViewById(R.id.txtendtag);
    startSec = (TextView) findViewById(R.id.txtstartsecnd);
    endSec = (TextView) findViewById(R.id.txtendsecnd);
    btnplay = (ImageButton) findViewById(R.id.btnplay);
    btnback = (Button) findViewById(R.id.btnback);
    btnback.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            ((MyMixes) getParent()).goBack();
        }
    });

    btnplay.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            btnClick();
        }
    });

    splitArray();

    Thread t = new Thread()
    {
        public void run() 
        {
            while (isDownloading) 
            {
                if (Data.filenames != null && Data.filenames.size() >= (getIntent() .getExtras().getInt("index") + 1) && Data.filenames.get(getIntent().getExtras() .getInt("index")) != null) 
                {
                    try 
                    {
                        mediaPlayer = new MediaPlayer();
                        mediaPlayer.setDataSource(Data.filenames.get(getIntent().getExtras().getInt("index")));
                        mediaPlayer.prepare();
                        mediaPlayer.start();
                        Timer t = new Timer();

                        handler.postDelayed(onEverySecond, 1000);
                        mediaPlayer.setOnCompletionListener(new OnCompletionListener() 
                        {
                            @Override
                            public void onCompletion(MediaPlayer mp) {
                                mediaPlayer.seekTo(0);
                            }
                        });
                        boolean isPlaying = mediaPlayer.isPlaying();
                        if(!isPlaying){
                            mediaPlayer.pause();

                        }
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    } catch (IllegalStateException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        isDownloading = false;
                    }
                }
            }
        }
    };
    t.start();
}

private Runnable onEverySecond=new Runnable()
{
    public void run() 
    {
        if (mediaPlayer.isPlaying()) 
        {
            for (int i = index; i < intervals.length; i++) 
            {
                if (i != index && mediaPlayer.getCurrentPosition() > intervals[i]) 
                {
                    index = i;
                    handler.dispatchMessage(handler.obtainMessage());
                    handler.postDelayed(onEverySecond, 1000);
                    break;
                }
            }
        }
    }
};

Handler handler = new Handler() 
{
    @Override
    public void handleMessage(Message msg) {
        txtName.setText(arrName.get(index));
        textEndName.setText(arrName.get(index+1));
        super.handleMessage(msg);
    }
};

public void splitArray()
{

    strSplit = kggg.split("\n");// string array
    intervals = new long[strSplit.length];
    Time timer;

    for (int j = 0; j < strSplit.length; j++) 
    {
        split = strSplit[j];// string
        split1 = split.split("-");// string array

        arrName.add(split1[0]);
        String timeq = split1[1];

        String[] timed = timeq.split(":");

        if(timed.length == 3)
        {
            timer = new Time(Integer.parseInt(timed[0].trim()), Integer.parseInt(timed[1].trim()), Integer.parseInt(timed[2].trim()));
            intervals[j] = timer.getTime();
        }
        else if(timed.length == 2)
        {
            timer = new Time(0, Integer.parseInt(timed[0].trim()), Integer.parseInt(timed[1].trim()));
            intervals[j] = timer.getTime();
        }
        else if(timed.length == 1)
        {
            timer = new Time(0, 0, Integer.parseInt(timed[0].trim()));
            intervals[j] = timer.getTime();
        }
    }

    for (int j = intervals.length-1; j >= 0 ; j--) 
    {
        intervals[j] = intervals[j] - intervals[0]; 
    }
}
public void btnClick()
{
    k++;
    k = k % 2;
    startSong(k);
}
private void startSong(int i) {
    if (i == 1) {
        System.out.println("11111" + i);
        btnplay.setImageResource(R.drawable.pause);
        try {
            System.out.println("start try chech------");
            mediaPlayer.start();
        } catch (Exception e) {
            mediaPlayer.pause();
        }
    }
    if (i == 0) {
        btnplay.setImageResource(R.drawable.play);
        mediaPlayer.pause();
        System.out.println("00000" + i);
    }
}
4

1 に答える 1

0

これを行うべきではありません:

handler.dispatchMessage(handler.obtainMessage());

代わりにこれを試してください:

handler.sendMessage(handler.obtainMessage());

編集:私が気づいた他のことを追加しました

また、スレッドにループがあり、ブロックにwhile (isDownloading)設定isDownloadingされていることもわかります。このループ while は、複数回実行されることはありません。falsefinally

また、あなたはそうします

btnplay.setImageResource(R.drawable.play);

ヘッドの中に。これは良くありません。メイン (UI) スレッドで UI に関連するすべてを行う必要があります。

于 2012-07-18T09:08:36.457 に答える