如何使用不干扰主线程中我的计时器的后台线程使用 GraphView 库绘制数据?

问题描述

我正在使用 graphView 库 https://github.com/jjoe64/GraphView。我一直在弄乱它,直到我设法在倒数计时器倒计时时绘制了我的数据。

问题是,当它绘制我的数据时,它会导致计时器延迟,所以假设一个阶段的计时器还剩 5 秒,它突然冻结了。问题是图形的X坐标也是倒计时的时间。所以我认为问题在于,在计算代码中的时间时,更新显示间的 textView 与在图形上绘制点之间存在延迟。

我的问题是我该怎么做才能避免这种情况?我环顾四周,似乎使用后台线程被认为是一种解决方案。所以我查看了 YouTube 上的一些视频,然后想到了这个:

  private void addEntry(double time) {
    double n = command.getToolNo(),x = command.getMode(),b = command.getBitDuration();
    double low = command.getDownStageValue(),high = command.getUpStageValue();

    //X coordinate is time
    double coorX = time;

    //Y coordinate is the stage value
    double coorY = command.getDownStageValue();

    if (command.getCurrentStage() == stage_up) {
        coorY = command.getUpStageValue();
    }

    //Line Thickness
    series.setThickness(10);
    //Line colour
    series.setColor(Color.RED);
  
    series.appendData(new DataPoint(coorX,coorY),false,5);
    linegraph.addSeries(series);

}

这是加分的方法

对于线程来说,这个方法在哪里:

 public void startThread()
{

    Runnable runnable = new Runnable() {
        @Override
        public void run() {
           while(true)
            {
                Log.d("StartThread","Started");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        addEntry(t/1000);
                    }
                });

                try {
                    switch(command.getBitDuration())
                        {
                            case 20:Thread.sleep(1500);break;

                            case 30:Thread.sleep(2500);break;

                            case 60:Thread.sleep(4500);break;
                        }
                } catch (Exception e) {
                    e.printstacktrace();
                }

            }
        }
    };

    Thread backgroundThread = new Thread(runnable);
    backgroundThread.start();

    if(backgroundThread.isAlive())
    {
        Toast.makeText(this,"Thread is alive",Toast.LENGTH_SHORT).show();
    }
    else
    {
        Toast.makeText(this,"Thread is not working",Toast.LENGTH_SHORT).show();
    }
}

我在开始倒计时的 onClick 侦听器中触发了 startThread 方法

     startBtn.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (!counterStarted) {
                    countDownTimer_total.start();
                    counterStarted = true;

                } else {
                    Toast.makeText(getApplicationContext(),"counter already started",Toast.LENGTH_SHORT).show();
                    // should call the stop warning message
                }


                startThread();
}

这是正确的还是遗漏了什么?我问这个是因为延迟仍然存在并且我觉得线程实际上不在后台所以我的代码有什么问题?或者应该怎么做?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)