Android 流式播放mp3时捕获异常

Android 流式播放mp3时捕获异常,android,android-asynctask,android-mediaplayer,Android,Android Asynctask,Android Mediaplayer,我需要在我的应用程序中传输mp3文件,如果服务器上的mp3文件丢失,我将面临一个问题。所以我的代码工作得很好,除非那个位置没有mp3。每当这种情况发生时,我的应用程序就会崩溃。有人能帮我抓住这个错误,并禁用应用程序崩溃时,没有mp3音频的位置 这是我的密码: mediaPlayer.setDataSource(data.get(position) .getSONG_MP3()); ne

我需要在我的应用程序中传输mp3文件,如果服务器上的mp3文件丢失,我将面临一个问题。所以我的代码工作得很好,除非那个位置没有mp3。每当这种情况发生时,我的应用程序就会崩溃。有人能帮我抓住这个错误,并禁用应用程序崩溃时,没有mp3音频的位置

这是我的密码:

mediaPlayer.setDataSource(data.get(position)
                                .getSONG_MP3());
                        new AsyncTask<Void, Void, Void>() {
                            @Override
                            protected void onPreExecute() {
                                bufferingDialog.setMessage(activity
                                        .getString(R.string.buffering));
                                bufferingDialog.show();
                                super.onPreExecute();
                            }

                            @Override
                            protected Void doInBackground(Void... params) {

                                try {
                                    mediaPlayer.prepare();
                                } catch (IllegalStateException e) {
                                    e.printStackTrace();

                                } catch (IOException e) {
                                    Log.v("--", "4");

                                    bufferingDialog.dismiss();
                                    ((AlbumDetails) activity)
                                            .changePicToPlay(position);
                                    playSong.setBackgroundResource(R.drawable.play_nr);
                                    Toast.makeText(activity,
                                            "Song not existing",
                                            Toast.LENGTH_SHORT).show();
                                    e.printStackTrace();
                                }

                                mediaPlayer.start();
                                return null;
                            }

                            @Override
                            protected void onPostExecute(Void result) {
                                if (bufferingDialog.isShowing())
                                    bufferingDialog.dismiss();
                                super.onPostExecute(result);
                            }
                        }.execute();
有人能帮我吗

playSong.setBackgroundResource(R.drawable.play_nr);
无法从线程内部编辑布局, 在活动类的开头定义处理程序

Handler handler = new Handler();
然后在doInBackground内使用:

handler.post(new Runnable() {
    @Override
    public void run() {
      playSong.setBackgroundResource(R.drawable.play_nr);
    }
});

您正试图从catch块中操作UI元素,但未按要求位于UI线程上


使您的doInBackground返回true如果成功,则返回false如果失败(将Void result更改为Boolean),并将所有与UI相关的代码移动到onPostExecute。

是的,感谢您的帮助,我还将Toast添加到处理程序中,因为Toast也在编辑布局。
handler.post(new Runnable() {
    @Override
    public void run() {
      playSong.setBackgroundResource(R.drawable.play_nr);
    }
});