当前位置: 首页 > news >正文

Android随记

学习笔记

      • 安卓
      • 1、recycleview
      • 2、Eventbus使用机制
      • 3、检查是否有网络
      • 4、OKHttp详解
      • 5、音视频焦点切换详解

安卓

1、recycleview

((TextView) layoutManager.findViewByPosition(mCurSiteIndex).findViewById(R.id.tv_stationname)).setTextColor(Color.parseColor("#52A8FF"));

找到recycleview中的父布局,要强制转换类型才能设置具体字体颜色

2、如果在fragment中出现无法用tv_sitefirst.setText(stations.get(0).getName());赋值
stations = mCurLine.getStations();用 = 赋值,很有可能会造空指针异常,此时可以将上面代码改为
stations.clear(); stations.addAll(mCurLine.getStations());

2、Eventbus使用机制

  • 先在xml里面定义解析出想要的value值,然后通过下面的代码发送通知
 EventBus.getDefault().post(new StationnameEvent(value));
  • 然后定义一个StationnameEvent类
public class StationnameEvent {private String txt;public StationnameEvent(@NonNull String txt) {this.txt = txt;}public String getTxt() {return txt;}
}
  • 在要获取的地方,进行注册获取
 @Subscribe(threadMode = ThreadMode.MAIN)public void onReceiveStationnameEvent(StationnameEvent event) {//TODO 里面执行具体要执行的东西,比如显示view视图啥的.}

特别注意,onReceiveStationnameEvent,这个名称一定要和类的名称一模一样,否则接收不到消息。

3、检查是否有网络

public boolean isNetworkAvailable(Activity activity){Context context = activity.getApplicationContext();// 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理)ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);if (connectivityManager == null){return false;}else{// 获取NetworkInfo对象NetworkInfo[] networkInfo = connectivityManager.getAllNetworkInfo();if (networkInfo != null && networkInfo.length > 0){for (int i = 0; i < networkInfo.length; i++){System.out.println(i + "===状态===" + networkInfo[i].getState());System.out.println(i + "===类型===" + networkInfo[i].getTypeName());// 判断当前网络状态是否为连接状态if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED){return true;}}}}return false;}

4、OKHttp详解

https://www.jianshu.com/p/9aa969dd1b4d

在AndroidManifest.xml中加入联网权限

<uses-permission android:name="android.permission.INTERNET" />

1、拿到OkHttpClient对象

OkHttpClient okHttpClient = new OkHttpClient() 

2、构造Request对象

Request request = new Request.Builder().get().url("https:www.baidu.com").build();

这里我们采用建造者模式和链式调用指明是进行Get请求,并传入Get请求的地址

如果我们需要在get请求时传递参数,我们可以以下面的方式将参数拼接在url之后

https:www.baidu.com?username=admin&password=admin

3、将Request封装为Call

Call call = client.newCall(request);

4、根据需要调用同步或者异步请求方法

//同步调用,返回Response,会抛出IO异常
Response response = call.execute();//异步调用,并设置回调函数
call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Toast.makeText(OkHttpActivity.this, "get failed", Toast.LENGTH_SHORT).show();}@Overridepublic void onResponse(Call call, final Response response) throws IOException {final String res = response.body().string();runOnUiThread(new Runnable() {@Overridepublic void run() {contentTv.setText(res);}});}
});
  • 同步调用会阻塞主线程,一般不适用
  • 异步调用的回调函数是在子线程,我们不能在子线程更新UI,需要借助于runOnUiThread()方法或者Handler来处理

注意:::对okHttp连接超时进行处理

            public void onFailure(Call call, IOException e) {Log.e(TAG, mPlayInfo.getPdfilename() + "下载进度:连接失败-" + e.getMessage());// 失败终端线程if(e instanceof SocketTimeoutException && serversLoadTimes<BaseConstant.maxLoadTimes){如果超时并未超过指定次数,则重新连接Log.e(TAG, mPlayInfo.getPdfilename() + "下载进度:超时" + e.getMessage()+"尝试第 "+serversLoadTimes+" 次");serversLoadTimes++;okHttpClient.newCall(call.request()).enqueue(this);}else {Log.e(TAG, mPlayInfo.getPdfilename() + "下载出错" + e.toString());interrupt();}}

5、音视频焦点切换详解

1、在播放视频的类中,进行注册

  	private AudioManager mAudioManager;private AudioFocusRequest audioFocusRequest;private AudioManager.OnAudioFocusChangeListener mAudioFocusChangeListener;

2、在oncreate进行初始化

 // 处理音频焦点-处理多个程序会来竞争音频输出设备mAudioManager = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);mAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {@Overridepublic void onAudioFocusChange(int focusChange) {Log.e("Playfragment ", "音频焦点切换:" + focusChange);/* if (videoView.getBackground()==null){Log.e("视频不在播放", "音频焦点切换:" + focusChange);return;}*/switch (focusChange) {case AudioManager.AUDIOFOCUS_GAIN:// 获取audio focusLog.e("Playfragment ", "获得音频焦点,提高音量" );setVolume(1, videoView);break;case AudioManager.AUDIOFOCUS_LOSS:// 失去audio focus很长一段时间,必须停止所有的audio播放,清理资源Log.e("Playfragment ", "onAudioFocusChange长时间失去音频焦点,降低音量,释放资源");setVolume(0, videoView);break;/*case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:// 暂时失去audio focus,但是很快就会重新获得,在此状态应该暂停所有音频播放,但是不能清除资源if (mediaPlayer.isPlaying())mediaPlayer.pause();break;*/case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:Log.e("Playfragment ", "onAudioFocusChange短暂失去音频焦点,降低音量");// 暂时失去 audio focus,但是允许持续播放音频(以很小的声音),不需要完全停止播放。setVolume(0, videoView);break;default:break;}}};

3、调节音量策略

 /*** @param volume 音量大小* @param object VideoView实例*               ///VideoView 反射 MediaPlayer控制音量 http://blog.csdn.net/u012874222/article/details/73303264*               静音有效果,恢复无效*/private void setVolume(float volume, Object object) {try {Log.e("Playfragment ", "播放节目,音频焦点切换设置音量:" + volume);Class<?> forName = Class.forName("android.widget.VideoView");Field field = forName.getDeclaredField("mMediaPlayer");field.setAccessible(true);MediaPlayer mMediaPlayer = (MediaPlayer) field.get(object);mMediaPlayer.setVolume(volume, volume);} catch (Exception e) {Log.e("Playfragment ", "播放节目,音频焦点切换设置音量" + volume + "出错:" + e.toString());}}

4、在onprepare中进行request请求

mAudioManager.requestAudioFocus(mAudioFocusChangeListener,AudioManager.STREAM_MUSIC,AudioManager.AUDIOFOCUS_GAIN);

5、进行释放资源,ondestroy

 mAudioManager.abandonAudioFocus(mAudioFocusChangeListener);

二、在需要短暂播放声音的地方(如到站播报)
1、在oncreate中

 // 处理音频焦点-处理多个程序会来竞争音频输出设备mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {// 对于Android 8.0+audioFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT).setOnAudioFocusChangeListener(mAudioFocusChangeListener).build();audioFocusRequest.acceptsDelayedFocusGain();}

2、在具体播放声音的逻辑中

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {mAudioManager.requestAudioFocus(audioFocusRequest);Log.e(TAG, "到站播报请求音频焦点");} else {// 小于Android 8.0int result = mAudioManager.requestAudioFocus(mAudioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {// could not get audio focus.Log.e(TAG, "到站播报请求音频焦点出错:"+result);}else {Log.d(TAG, "到站播报请求音频焦点<8,"+result);}}
      mHandler.postDelayed(new Runnable() {@Overridepublic void run() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {mAudioManager.abandonAudioFocusRequest(audioFocusRequest);Log.e(TAG, "到站播报释放音频焦点");}else {mAudioManager.abandonAudioFocus(mAudioFocusChangeListener);Log.e(TAG, "到站播报释放音频焦点<8");}mIsPlaying = false;mHandler.removeCallbacks(this);}}, 3000);break;

4、包名就是 com.####.
应用签名下载应用签名软件下载


http://www.mrgr.cn/news/18653.html

相关文章:

  • 【Redis】Redis 持久化机制详解:RDB、AOF 和混合持久化的工作原理及优劣分析
  • x-cmd pkg | gdu - 用 Go 编写的磁盘使用分析器
  • Altium Designer爬虫工具/网页信息获取工具
  • Java异常处理-如何选择异常类型
  • 【软件文档】系统安全保证措施(Word)
  • 新手如何下载微信视频号里面的短视频?推荐7种方法!
  • 【18.5 python中创建线程】
  • AI大模型开发转型指南:如何学习并成功找到工作?
  • web渗透:文件解析漏洞
  • 动手打造互动虚拟人
  • windows python的jupyter的安装教程
  • classmethod的使用
  • 记一次学习--HIDS-phpwebshell绕过
  • 视频搬运的素材网站有哪些?打包好的视频素材在哪找?
  • ArcGIS中利用DEM提取水系线
  • 操作教程丨MaxKB+Ollama:快速构建基于大语言模型的本地知识库问答系统
  • MAT:一款针对MSSQL服务器的安全检测与审计工具
  • 数图亮相第三届中国区域零售创新峰会:共绘零售新蓝图,携手迈向新征程
  • git stash命令及丢失代码问题
  • 8、Django Admin后台中添加Logo