Android Java:postDelayed中的“无法解析”

时间:2017-01-01 08:47:13

标签: java android audio runnable

我正在使用第一个答案here尝试启动重复任务,更新搜索栏(“timeSlider”)以在播放音频文件时显示进度。重复功能是updateTimeSlider()。当通过postDelayed启动时,updateTimeSlider会出现“无法解析符号”错误(请参阅本文底部的图片)。 updateTimeSlider()在单独一行时也不会出现该错误(也显示在图像中)。

(请注意,行上的updateTimeSlider()本身并不是代码的真实方式。只是为了证明它在那个位置工作。)

任何人都可以帮助我了解如何纠正postDelayed行中的问题吗?

有些人建议我忘记在do中写下doUpdateTimeSlider。我没忘记。我想执行updateTimeSlider(没有do),它执行得很好并且不会在postDelayed之外产生错误。 updateTimeSlider是通过JNI(Java Native Interface)使用的C ++函数,它使用此Java文件底部的语句,如下所示:

private native void updateTimeSlider();

JNI方面的工作正常,updateTimeSlider()是我尝试执行的方法,而不是doUpdateTimeSlider

顺便说一下,我确实尝试将doUpdateTimeSlider放在那里,这也会导致错误:Variable doUpdateTimeSlider may not have been initialized

not initialized error

如果我可以执行doUpdateTimeSlider,我也看不出它有什么用处,因为它没有代码来实际更新timeSlider搜索栏。

public class PlayActivity extends AppCompatActivity {

private static final String TAG = "PlayActivity";
boolean playing = false;
private int timeSliderInterval = 1000; // 1 second
private Handler timeSliderHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_play);

    final Runnable doUpdateTimeSlider = new Runnable() {
        @Override
        public void run() {
           timeSliderHandler.postDelayed(updateTimeSlider, timeSliderInterval);
           updateTimeSlider();
        }
    };

enter image description here

2 个答案:

答案 0 :(得分:1)

正如您在此处所见:https://stackoverflow.com/a/41413191/4409113

doUpdateTimeSlider

final Runnable doUpdateTimeSlider = new Runnable() {
     @Override
     public void run() {
         timeSliderHandler.postDelayed(doUpdateTimeSlider, timeSliderInterval);
         updateTimeSlider();
     }
 };

其中@ρяσѕρєяK也说了同样的话。

<强>更新

要修复may not have been initialized,您可以按照以下链接进行操作:

variable r might not have been initialized

"Variable example might not have been initialized" in anonymous class

所以:

final Runnable etc = null;
    final Runnable doUpdateTimeSlider = new Runnable() {
        @Override
        public void run() {
            timeSliderHandler.postDelayed(etc, timeSliderInterval);
            updateTimeSlider();
        }
    };

现在应该可以使用了!

答案 1 :(得分:1)

您可以替换:

timeSliderHandler.postDelayed(updateTimeSlider, timeSliderInterval);

使用:

timeSliderHandler.postDelayed(doUpdateTimeSlider, timeSliderInterval);

您忘记在do中写doUpdateTimeSlider