android - Thread 内部的方法失去焦点

标签 android multithreading audio media-player runnable

我有一个从 onCreate( 主线程) 调用的方法。在方法内部,我又调用了一个方法和一个重复调用相同方法的 Runnable。看起来是这样的

 public void start() {
    try {
        if (start == 0) {
            playpause.setBackgroundDrawable(getResources().getDrawable(
                    R.drawable.play));
            initialPoiPlayStatus = true;
            playAudio();
        }
        if (play) {
            if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
                // for displaying view stub
                poi = listOfPOI.get(j);
                int pos = mMediaPlayer.getCurrentPosition();
                int convSeconds = -1;
                convSeconds = ((int) (pos) / 1000);
                // displaying the you tube pop up based on the parsed value
                // from the plist
                youTube(convSeconds);
                // call the method to change the image while the audio is
                // playing
                changeImage();
                seek_bar.setProgress(current_position);
                notification = new Runnable() {
                    public void run() {
                        start();
                    }
                };
                handler.postDelayed(notification, 1000);
            } else {
                if (j != (listOfPOI.size() - 1)) {
                    firstPlay = true;
                    initialPoiPlayStatus = true;
                    j++;
                    playAudio();
                    start();
                    // retrieve mascot info
                    if (isNetworkAvailable() == true) {
                        receiveResponse();
                    } else {

                    }
                } else {
                    threadHandler.sendEmptyMessage(0);
                }
            }
        }
    } catch (Exception e) {
        System.out.println(poi.getPlistPath());
        e.printStackTrace();
    }
}

现在在youtube里面,
 private void youTube(int convSeconds) {
    frameLayout = (FrameLayout) findViewById(R.id.frameLayout);
    youtubeWebView = (WebView) findViewById(R.id.youtubewebView);
    try {
        if (poi.getIsYoutubePresent().equals("true")) {

            //mMediaPlayer.pause();
            isNetworkAvailable();
            if (isNetworkAvailable() == true) {

                String startTimeyoutube = poi.getYoutubestartTime();
                Integer youTubeStartTime = Integer
                        .parseInt(startTimeyoutube);
                if (convSeconds == youTubeStartTime) {

                    if (frameLayout.getVisibility() == View.GONE) {
                        frameLayout.setVisibility(View.VISIBLE);
                        slideUp = AnimationUtils.loadAnimation(this,
                                R.anim.slide_up);
                        frameLayout.startAnimation(slideUp);
                    }

                    final String youTubeurl = poi.getLink();
                    WebSettings websets = youtubeWebView.getSettings();
                    websets.setJavaScriptEnabled(true);
                    registerForContextMenu(youtubeWebView);
                    youtubeWebView
                            .setWebViewClient(new ItemsWebViewClient());
                    youtubeWebView.loadUrl(youTubeurl);
                    youtubeWebView.getSettings().setLayoutAlgorithm(
                            LayoutAlgorithm.SINGLE_COLUMN);
                    firstPlay = false;
                    initialPoiPlayStatus = false;
                    paused = true;
                    play = false;
                    playpause.setBackgroundDrawable(getResources().getDrawable(
                            R.drawable.play));
                    if (mMediaPlayer.isPlaying()) {
                        mMediaPlayer.pause(); 
                    }

                    Button goBtn = (Button) findViewById(R.id.youtubeButton);
                    goBtn.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View V) {
                            startActivity(new Intent(Intent.ACTION_VIEW,
                                    Uri.parse(youTubeurl)));
                        }
                    });

                    ImageButton close = (ImageButton) findViewById(R.id.youtubecloseButton);
                    close.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View arg0) {
                            frameLayout.setVisibility(View.GONE);
                            if (!mMediaPlayer.isPlaying()) {
                                mMediaPlayer.start();
                            }
                                    playpause.setBackgroundDrawable(getResources().getDrawable(
                                    R.drawable.pause));
                        }
                    });
                } 
            } else {
                Toast.makeText(getApplicationContext(), "No network available", Toast.LENGTH_SHORT).show();
            }
        } else {
            frameLayout.setVisibility(View.INVISIBLE);
        }

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

每当 (convSeconds == youTubeStartTime) {} 变为真时,我都会暂停音频,即
 if (mMediaPlayer.isPlaying()) {
    mMediaPlayer.pause(); 
}

在此期间,我还希望 Runnable 通知中的 start() 应该继续调用。但是,如果我让音频暂停,这不仅会发生。在这种情况下完全失去控制。并在按下图像按钮关闭时,我试图让音频再次像这样播放
if (!mMediaPlayer.isPlaying()) {
    mMediaPlayer.start();
}

音频现在继续播放,但 slider /搜索栏没有移动,因为通知内部的 start() 没有被调用。

有谁知道为什么会这样?

备注 :如果我不让我的媒体播放器不暂停,它可以正常工作。当我让音频暂停时,我遇到了问题

最佳答案

我终于解决了这个问题,它可能不是标准的方法。但它对我有用。

我只是复制

           notification = new Runnable() {

                public void run() {
                    start();
                }
            };
            handler.postDelayed(notification, 1000); 

我试图关闭图像按钮的地方,即
  ImageButton close = (ImageButton) findViewById(R.id.youtubecloseButton);
                close.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View arg0) {
                        frameLayout.setVisibility(View.GONE);
                        if (!mMediaPlayer.isPlaying()) {
                            mMediaPlayer.start();
                        }
           notification = new Runnable() {

                public void run() {
                    start();
                }
            };
            handler.postDelayed(notification, 1000); 
                    }
                });

关于android - Thread 内部的方法失去焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8224941/

相关文章:

android - 添加 BulletSpan 时 EditText 不增加宽度

java - 取消 ThreadPoolExector 中的等待任务

c - pthread_create 参数丢失

java - 无法解析 FirebaseFirestore Android

java - findFirstVisibleItemPosition() 在 nestedScrollView 中返回 0

javascript - 如何在 'now playing card'中显示音乐专辑封面?

android - 在Exoplayer中使用Dynamicmediasource添加多个Audio Hlsmedia源,而无需暂停当前正在播放的Player。

audio - 使用互相关来检测信号的开始

android - 在 Android 中将我的应用程序注册为相机应用程序

java - Java 中的多线程控制