java - 为什么这个 TextView 为空?

标签 java android service

所以我正在尝试更新另一个类的 TextView 。但是,每当我调用该方法时,textview 似乎为空?

我不知道为什么会这样。

这里是相关代码

媒体播放器服务:

@Override
    public void onPrepared(MediaPlayer mp) {
        UI = new MediaPlayerUI();
        mp.start();
            int minutesDuration = mp.getDuration() / 6000;
            int secondsDuration = (mp.getDuration() % 6000) / 1000;
            UI.setDurationText(minutesDuration,secondsDuration);
            UI.setProgressBarVisibility(0);
            UI.setPauseButtonVisibility(1);
            UI.playback();

    }

媒体播放器界面:

public class MediaPlayerUI extends MediaPlayerFragment {


public MediaPlayerUI(){

}
public void setSeekBarProgress(int position){
    seekBar.setProgress(position);
}
public void setSeekBarMax(int max){
    seekBar.setMax(max);
}

public int getSeekBarProgress(){
    return seekBar.getProgress();
}

public void setDurationText(int minutes, int seconds){

}

public void setProgressBarVisibility(int code){
    if(code == 0){
        progressBar.setVisibility(ProgressBar.GONE);
    }else{
        progressBar.setVisibility(ProgressBar.VISIBLE);
    }
}

public void setPauseButtonVisibility(int code){
    if(code == 0){
        pauseButton.setVisibility(View.GONE);
    }else{
        pauseButton.setVisibility(View.VISIBLE);
    }
}

媒体播放器 fragment :

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_media_player, container, false);
    mSeriesImage = (ImageView) v.findViewById(R.id.series_image);
    progressBar = (ProgressBar) v.findViewById(R.id.progress_bar);
    seekBar = (SeekBar) v.findViewById(R.id.seek_bar);
    playButton = (ImageButton) v.findViewById(R.id.play_button);
    pauseButton = (ImageButton) v.findViewById(R.id.pause_button);
    messageTitle = (TextView) v.findViewById(R.id.message_title);
    seriesTitle = (TextView) v.findViewById(R.id.series_name);
    mProgressText = (TextView) v.findViewById(R.id.progress_text);
    mDurationText = (TextView) v.findViewById(R.id.duration_text);
    mNoAudioText = (TextView) v.findViewById(R.id.no_audio_text);



    mNoAudioText.setVisibility(v.GONE);
    playButton.setVisibility(v.GONE);
    pauseButton.setVisibility(v.GONE);

    mAudioURL = getArguments().getString(Keys.AUDIO_URL_KEY);
    mModel = getArguments().getParcelable(Keys.INTENT_SERIES_MODEL_OBJECT_KEY);
    mPosition = getArguments().getInt(Keys.POSTION_KEY);
    messageTitle.setText(mModel.getmMessageTitle().get(mPosition));
    seriesTitle.setText(mModel.getmSeriesName());


    Intent intent = new Intent(getActivity(), MediaPlayerService.class);
    intent.putExtra(Keys.INTENT_SERIES_MODEL_OBJECT_KEY,mModel);
    intent.putExtra(Keys.POSTION_KEY,mPosition);
    intent.putExtra(Keys.AUDIO_URL_KEY,mAudioURL);
    getActivity().bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

    seekBar.setEnabled(true);

    return v;
}
public void setDurationTextView(int minutes,int seconds){
    Log.i(TAG,"mDurationText...."+mDurationText);

}

日志输出:

10-29 20:25:00.091 26349-26349/com.tubbs.citychurchob   I/MediaPlayerFragment: mDurationText....null

此外,如果我直接在 MediaPlayerFragment 中调用该方法,该方法不会返回空值。

我真的只是在摸索如何从服务更新 UI,所以任何有用的建议也会很好。谢谢。

最佳答案

因为当您调用 setDurationText() 时,不能保证 TextView 是否已经创建。

在这种情况下,您可以在您的 fragment 中注册一个广播接收器,然后从该服务发送广播

 IntentFilter intentFilter = new IntentFilter();
 intentFilter.addAction("update_media_ui"); 
 updateMediaUiReceiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                // Get the data here and then set the text if 
                // the TextView is not null or save the data first 
                // and set it later if the TextView is null.
            }
        };
 registerReceiver(updateMediaUiReceiver, intentFilter);

然后您还需要在 Fragment 的 onDestroy() 中注销接收者

unregisterReceiver(updateMediaUiReceiver);

这是从服务发送广播的方法

Intent serviceIntent = new Intent();
serviceIntent.setAction("update_media_ui");
this.sendBroadcast(serviceIntent);

关于java - 为什么这个 TextView 为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33427011/

相关文章:

php - 无法使用 WAMP 将数据从 android Activity 插入 MySQL 到 php 数据库

android - 微调项的上下文菜单

Android 服务意外关闭

java - SWT 透明像素更改为白色

java - 在 Java 中正确声明 int 类型的多维数组

java - 如何借助Nutshell Api进行基于自定义字段的搜索?

android - 从服务到 Activity 的 ResultReceiver

java - 关于 OOP 的问题

java - 在 Eclipse 中添加编辑文本时出错

Android 生命周期——我应该使用服务吗?