Android 启动videoview时,应用程序有时会崩溃

Android 启动videoview时,应用程序有时会崩溃,android,crash,android-videoview,freeze,Android,Crash,Android Videoview,Freeze,我正在使用VideoView来播放实时流,它在大多数情况下运行良好,但有时应用程序会冻结片刻,要么继续播放,要么崩溃并将我发送到主屏幕。 这是当我从列表视图中选择一个项目或单击“向下键/向上键”时发生的情况: public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { if (mVideoView != null &&

我正在使用VideoView来播放实时流,它在大多数情况下运行良好,但有时应用程序会冻结片刻,要么继续播放,要么崩溃并将我发送到主屏幕。 这是当我从列表视图中选择一个项目或单击“向下键/向上键”时发生的情况:

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
        if (mVideoView != null && mListView == null) {
            if (listViewNext != listViewCurrent) { playChannel(listViewNext, 0); }
            return true;
        }
    }
}

private void playChannel(int channel, int id) {
    listViewCurrent = channel;
    listViewNext = listViewCurrent + 1;
    listViewPrev = listViewCurrent - 1;
    if (mListViewChannels == "Danish") {
        if (listViewNext >= arrayDanishChannels.size()) { listViewNext = 0; }
        if (listViewPrev < 0) { listViewPrev = arrayDanishChannels.size() - 1; }
        mListViewLink = arrayDanishLinks.get(listViewCurrent);
    } else if (mListViewChannels == "World") {
        if (listViewNext >= arrayWorldChannels.size()) { listViewNext = 0; }
        if (listViewPrev < 0) { listViewPrev = arrayWorldChannels.size() - 1; }
        mListViewLink = arrayWorldLinks.get(listViewCurrent);
    }

    String listViewName = (String) listView.getItemAtPosition(listViewCurrent);

    String[] links = mListViewLink.split(";"); int temp = id + 1;
    if (id < 0 || temp > links.length) { id = 0; temp = 1; }
    mListViewLink = links[id]; listViewLinkId = temp; listViewLinkIds = links.length;

    startVideo(listViewName+" ("+listViewLinkId+"/"+listViewLinkIds+")", mListViewLink);

    mListViewCurrent = mListViewChannels;
}

private void startVideo(String title, String link) {
    toastDisplay.cancel();
    setInfoView(title);
    imageView.setVisibility(ImageView.INVISIBLE);
    videoView.removeCallbacks(videoRunnable);
    videoView.stopPlayback();
    MediaController media = new MediaController(MainActivity.this); media.setAnchorView(videoView); media.setMediaPlayer(videoView);
    videoView.setMediaController(media);
    videoView.setVideoPath(link);
    videoView.setOnPreparedListener(videoViewPreparedListener);
    videoView.setOnErrorListener(videoViewErrorListener);
    videoView.setVisibility(VideoView.VISIBLE);
    videoView.postDelayed(videoRunnable, videoViewTimeOut);
    videoView.start();
    mVideoView = "true";

    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
    SharedPreferences.Editor edit = pref.edit();
    edit.putString("setLastStream", title+";"+mListViewChannels);
    edit.apply();
}
private void setInfoView(String title) {
    infoView.removeCallbacks(infoRunnable);
    infoView.setText(title);
    infoView.setVisibility(TextView.VISIBLE);
    progressBar.setVisibility(ProgressBar.VISIBLE);
}
public boolean onKeyDown(int-keyCode,KeyEvent事件){
if(keyCode==KeyEvent.keyCode\u DPAD\u DOWN){
if(mVideoView!=null&&mListView==null){
如果(listViewNext!=listViewCurrent){playChannel(listViewNext,0);}
返回true;
}
}
}
专用void播放频道(int频道,int id){
listViewCurrent=通道;
listViewNext=listViewCurrent+1;
listViewPrev=listViewCurrent-1;
如果(MListViewChannel==“丹麦文”){
如果(listViewNext>=ArrayDanishChannel.size()){listViewNext=0;}
如果(listViewPrev<0){listViewPrev=ArrayDanishChannel.size()-1;}
mListViewLink=arrayDanishLinks.get(listViewCurrent);
}else if(MListViewChannel==“世界”){
如果(listViewNext>=arrayWorldChannels.size()){listViewNext=0;}
如果(listViewPrev<0){listViewPrev=arrayWorldChannels.size()-1;}
mListViewLink=arrayWorldLinks.get(listViewCurrent);
}
字符串listViewName=(字符串)listView.getItemAtPosition(listViewCurrent);
字符串[]links=mListViewLink.split(“;”);int-temp=id+1;
如果(id<0 | | temp>links.length){id=0;temp=1;}
mListViewLink=links[id];listViewLinkId=temp;listViewLinkId=links.length;
startVideo(listViewName+”(“+listViewLinkId+”/“+listViewLinkId+”),mListViewLink);
mListViewCurrent=mListViewChannels;
}
私有void startVideo(字符串标题、字符串链接){
toastDisplay.cancel();
setInfoView(标题);
设置可见性(imageView.INVISIBLE);
videoView.removeCallbacks(videoRunnable);
videoView.stopPlayback();
MediaController媒体=新的MediaController(MainActivity.this);media.setAnchorView(videoView);media.setMediaPlayer(videoView);
videoView.setMediaController(媒体);
设置视频路径(链接);
videoView.setOnPreparedListener(videoViewPreparedListener);
videoView.SetOneErrorListener(videoViewErrorListener);
设置可见性(videoView.VISIBLE);
videoView.postDelayed(videoRunnable,videoViewTimeOut);
videoView.start();
mVideoView=“true”;
SharedReferences pref=PreferenceManager.GetDefaultSharedReferences(MainActivity.this);
SharedReferences.Editor edit=pref.edit();
edit.putString(“setLastStream”,title+”;“+mListViewChannels);
edit.apply();
}
私有void setInfoView(字符串标题){
infoView.removeCallbacks(infoRunnable);
infoView.setText(标题);
setVisibility(TextView.VISIBLE);
progressBar.setVisibility(progressBar.VISIBLE);
}
请注意:我已经为这些流支付了费用,有些流是任何人都可以自由访问的,没有非法内容。 我正在使用固件为4.4.2的android机顶盒 我尝试在任何地方添加
try{..}最后{..}
,但有时它仍然会在随机时间冻结。 请帮助我,我是一个新的应用程序开发者,这真的让我发疯了。
很抱歉我的英语不好。

你能分享记录的崩溃异常吗?我很乐意,但正如我说的,我在这方面还很新,所以我不知道从哪里可以得到它。你能告诉我正确的方向吗?这在很大程度上取决于你的测试系统。如果您使用的是IDE,请查找logcat输出。如果你使用的是实际的设备,你可以安装logcat reader我使用的是实际的设备,我的机顶盒,我已经安装了logcat reader,但它并没有给我任何东西。它需要root吗?我已经输入了,当它随机崩溃时,它仍然没有报告任何错误,但是当我添加
String a=null;a、 toString()它报告了NullPointerException错误,所以我猜它不是任何异常错误?但它还能是什么呢?