转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51448597

项目源码(打赏5积分请点这边):http://download.csdn.net/detail/iwanghang/9524502

项目源码(免积分下载请点这边):http://download.csdn.net/detail/iwanghang/9682928

觉得博文有用,请点赞,请留言,请关注,谢谢!~

实现功能:
歌曲下载完成后通知主界面更新本地音乐

除了下面说明的一个问题,还有一些BUG有待修复,后续博文将会继续更新

//DownloadDialogFragment回传的是否下载成功的回传值
@Override
public void downloadSuccessListener(String isDownloadSuccess) {System.out.println("MainActivity.downloadSuccessListener = " + isDownloadSuccess);if (isDownloadSuccess.length() > 0){//Toast.makeText(MainActivity.this, "DownloadDialogFragment.下载成功.回传给.MainActivity = " + isDownloadSuccess, Toast.LENGTH_SHORT).show();//问题:下载完成后,确实通知媒体库更新了,但是马上初始化数据,可能媒体库还没有更新//临时解决:在ActionBar上,添加一个刷新按钮//永久解决:通过mp3Infos.size()的改变,来判断媒体库已经更新//更新本地音乐列表myMusicListFragment.loadData();//初始化数据myMusicListFragment.newInstance();//重新实例化一下本地音乐Fragment,加载新的数据}}

实现效果如图:

因为,没有自己的服务器,所以网络音乐所有相关功能(包含搜索音乐、下载音乐、下载歌词)均无法保证时效性,建议,尽快下载和练习;如果你下载时候,已经因为我采集的服务器更改规则,请给我留言,如果可以解决,我将在有空的时候献上新的源码。

(最新的,请下载最后一个,本博文对应版本2.5;如果需要逐步实现的过程,请下载所有)
(有兴趣可以看看版本2.4,有时候可以更新本地音乐列表,但是更新后,播放不了本地音乐,2.5在Playservice也有一些改动,本篇博文没有体现,有兴趣可以自己挖掘一下)

实现代码如下:
DownloadDialogFragment如下:

package com.iwanghang.drmplayer;import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.app.DialogFragment;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.Toast;import com.iwanghang.drmplayer.adapter.MyMusicListAdapter;
import com.iwanghang.drmplayer.utils.Constant;
import com.iwanghang.drmplayer.utils.DownloadUtils;
import com.iwanghang.drmplayer.utils.MediaUtils;
import com.iwanghang.drmplayer.vo.Mp3Info;
import com.iwanghang.drmplayer.vo.SearchResult;import java.io.File;
import java.util.ArrayList;/*** Created by iwanghang on 16/5/3.* DownloadDialogFargment*/
public class DownloadDialogFragment extends DialogFragment {private MyMusicListFragment myMusicListFragment;private ArrayList<Mp3Info> mp3Infos;private MyMusicListAdapter myMusicListAdapter;private SearchResult searchResult;//当前要下载的歌曲对象private MainActivity mainActivity;public static DownloadDialogFragment newInstance(SearchResult searchResult){DownloadDialogFragment downloadDialogFragment = new DownloadDialogFragment();downloadDialogFragment.searchResult = searchResult;return downloadDialogFragment;}private String[] items;@Overridepublic void onAttach(Context context) {super.onAttach(context);mainActivity = (MainActivity) getActivity();//items = new String[]{"下载","取消"};items = new String[]{getString(R.string.download),getString(R.string.cancel)};}// 回调接口//public interface DownloadSelectListener { // 是否选择(点击)下载.监听.按钮回调接口//    void downloadSelectListener(int isDownload); // 回传一个int,是否选择(点击)下载按钮 ; 回传0,表示下载;回传1,表示取消//}//创建对话框的事件方法@Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {final AlertDialog.Builder builder = new AlertDialog.Builder(mainActivity);builder.setCancelable(true);//返回键可以取消builder.setItems(items,new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which) {switch (which) {case 0://执行下载downloadMusic();break;case 1://取消dialog.dismiss();break;}//DownloadSelectListener listener = (DownloadSelectListener) getActivity(); // 回调接口//listener.downloadSelectListener(which);//回传0,表示下载;回传1,表示取消}});return builder.show();}// 回调接口public interface DownloadSuccessListener { // 下载是否成功.监听.按钮回调接口void downloadSuccessListener(String isDownloadSuccess); // 回传一个字符串}//下载音乐private void downloadMusic() {Toast.makeText(mainActivity, "正在下载:" + searchResult.getMusicName(), Toast.LENGTH_LONG).show();DownloadUtils.getsInstance().setListener(new DownloadUtils.OnDownloadListener() {@Overridepublic void onDowload(String mp3Url) { //下载成功Toast.makeText(mainActivity, "下载成功", Toast.LENGTH_SHORT).show();System.out.println("DownloadDialogFragment.downloadMusic @ = " + Environment.getExternalStorageDirectory()+Constant.DIR_MUSIC + "/" + mp3Url);//更新媒体库scanFile(mainActivity,Environment.getExternalStorageDirectory()+Constant.DIR_MUSIC + "/" + mp3Url);//更新 本地音乐列表 , 这个功能放在MainActivity实现//DownloadSuccessListener listener = (DownloadSuccessListener) getActivity(); // 空指针异常,因为Fragment已经销毁,所以getActivity()==null,需要使用下面的写法DownloadSuccessListener listener = mainActivity; // 回调接口System.out.println("DownloadDialogFragment.downloadMusic.listener = " + listener);listener.downloadSuccessListener(mp3Url); // 回传一个字符串 ,回传什么都行 ,只是告诉MainActivity ,已经下载成功了新的歌曲}@Overridepublic void onFailed(String error) { //下载失败Toast.makeText(mainActivity, error, Toast.LENGTH_SHORT).show();}}).download(searchResult);}/*** 通知媒体库更新文件* @param context* @param filePath 文件全路径** */public void scanFile(Context context, String filePath) {Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);scanIntent.setData(Uri.fromFile(new File(filePath)));context.sendBroadcast(scanIntent);}/*** 更新本地音乐列表*///private void loadDataAndChangeUI() {//    if(myMusicListFragment==null){//        myMusicListFragment = MyMusicListFragment.newInstance();//    }//    //mp3Infos = MediaUtils.getMp3Infos(mainActivity);//    //myMusicListAdapter = new MyMusicListAdapter(mainActivity,mp3Infos);//    //listView_my_music.setAdapter(myMusicListAdapter);//    myMusicListFragment.loadData();//初始化数据//    myMusicListFragment.changeUIStatusOnPlay(0);//}
}

MainActivity如下:

package com.iwanghang.drmplayer;import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.graphics.drawable.TransitionDrawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.TypedValue;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;import com.astuetz.PagerSlidingTabStrip;
import com.astuetz.viewpager.extensions.sample.QuickContactFragment;
import com.iwanghang.drmplayer.utils.MediaUtils;
import com.iwanghang.drmplayer.vo.Mp3Info;import java.nio.charset.CoderMalfunctionError;
import java.util.ArrayList;public class MainActivity extends BaseActivity implements DownloadDialogFragment.DownloadSuccessListener {// private final Handler handler = new Handler();private PagerSlidingTabStrip tabs;private ViewPager pager;private MyPagerAdapter adapter;public DRMPlayerApp app;//取出全局对象 方便调用// private Drawable oldBackground = null;
//  private int currentColor = 0xFFC74B46;private MyMusicListFragment myMusicListFragment;private NetMusicListFragment netMusicListFragment;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//取出全局对象 方便调用app = (DRMPlayerApp) getApplication();setContentView(R.layout.activity_main);tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);pager = (ViewPager) findViewById(R.id.pager);adapter = new MyPagerAdapter(getSupportFragmentManager());pager.setAdapter(adapter);/**android TypedValue.applyDimension()的作用这个方法是转变为标准尺寸的一个函数,例如int size =(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20,context.getResources().getDisplayMetrics());这里COMPLEX_UNIT_SP是单位,20是数值,也就是20sp。*/final int pageMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources().getDisplayMetrics());pager.setPageMargin(pageMargin);tabs.setViewPager(pager);//修改主界面颜色,稍后修复功能,暂时使用默认颜色//changeColor(currentColor);//绑定服务//服务在加载SplashActivity(欢迎页面)的时候,已经启动//bindPlayService();//这里,我在MyMusicListFragment里面绑定,而没有在MainActivity里绑定}@Overridepublic void publish(int progress) {//更新进度条}@Overridepublic void change(int position) {//更新歌曲位置.按钮的状态等信息/*** 本地音乐的播放UI实际上在MyMusicListFragment中,所以要* 先在MyMusicListFragmen中,写入public void changeUIStatus(int position){}* 然后,传参过去*/if (pager.getCurrentItem()==0){//如果页面等于0,则说明选中的是第一个页面,我的音乐页面System.out.println("MainActivity.change.pager.getCurrentItem()==0");myMusicListFragment.loadData();//初始化数据myMusicListFragment.changeUIStatusOnPlay(position);}else if (pager.getCurrentItem()==1){System.out.println("MainActivity.change.pager.getCurrentItem()==1");}}//DownloadDialogFragment回传的是否点击下载按钮的回传值//@Override//public void downloadSelectListener(int isDownload) {// if (isDownload == 0){//       Toast.makeText(MainActivity.this, "DownloadDialogFragment.下载点击事件.回传给.MainActivity", Toast.LENGTH_SHORT).show();////   }else if (isDownload == 1){//     Toast.makeText(MainActivity.this, "DownloadDialogFragment.取消点击事件.回传给.MainActivity", Toast.LENGTH_SHORT).show();//     //MyMusicListFragment.newInstance();//  }//}//DownloadDialogFragment回传的是否下载成功的回传值@Overridepublic void downloadSuccessListener(String isDownloadSuccess) {System.out.println("MainActivity.downloadSuccessListener = " + isDownloadSuccess);if (isDownloadSuccess.length() > 0){//Toast.makeText(MainActivity.this, "DownloadDialogFragment.下载成功.回传给.MainActivity = " + isDownloadSuccess, Toast.LENGTH_SHORT).show();//问题:下载完成后,确实通知媒体库更新了,但是马上初始化数据,可能媒体库还没有更新//临时解决:在ActionBar上,添加一个刷新按钮//永久解决:通过mp3Infos.size()的改变,来判断媒体库已经更新//更新本地音乐列表myMusicListFragment.loadData();//初始化数据myMusicListFragment.newInstance();//重新实例化一下本地音乐Fragment,加载新的数据}}//  @Override
//  public boolean onCreateOptionsMenu(Menu menu) {
//      getMenuInflater().inflate(R.menu.main, menu);
//      return true;
//  }
//
//  @Override
//  public boolean onOptionsItemSelected(MenuItem item) {
//
//      switch (item.getItemId()) {
//
//      case R.id.action_contact:
//          QuickContactFragment dialog = new QuickContactFragment();
//          dialog.show(getSupportFragmentManager(), "QuickContactFragment");
//          return true;
//
//      }
//
//      return super.onOptionsItemSelected(item);
//  }// private void changeColor(int newColor) {
//
//      tabs.setIndicatorColor(newColor);
//
//      // change ActionBar color just if an ActionBar is available
//      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
//
//          Drawable colorDrawable = new ColorDrawable(newColor);
//          Drawable bottomDrawable = getResources().getDrawable(R.drawable.actionbar_bottom);
//          LayerDrawable ld = new LayerDrawable(new Drawable[] { colorDrawable, bottomDrawable });
//
//          if (oldBackground == null) {
//
//              if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
//                  ld.setCallback(drawableCallback);
//              } else {
//                  getActionBar().setBackgroundDrawable(ld);
//              }
//
//          } else {
//
//              TransitionDrawable td = new TransitionDrawable(new Drawable[] { oldBackground, ld });
//
//              // workaround for broken ActionBarContainer drawable handling on
//              // pre-API 17 builds
//              // https://github.com/android/platform_frameworks_base/commit/a7cc06d82e45918c37429a59b14545c6a57db4e4
//              if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
//                  td.setCallback(drawableCallback);
//              } else {
//                  getActionBar().setBackgroundDrawable(td);
//              }
//
//              td.startTransition(200);
//
//          }
//
//          oldBackground = ld;
//
//          // http://stackoverflow.com/questions/11002691/actionbar-setbackgrounddrawable-nulling-background-from-thread-handler
//          getActionBar().setDisplayShowTitleEnabled(false);
//          getActionBar().setDisplayShowTitleEnabled(true);
//
//      }
//
//      currentColor = newColor;
//
//  }// public void onColorClicked(View v) {
//
//      int color = Color.parseColor(v.getTag().toString());
//      changeColor(color);
//
//  }// @Override
//  protected void onSaveInstanceState(Bundle outState) {
//      super.onSaveInstanceState(outState);
//      outState.putInt("currentColor", currentColor);
//  }// @Override
//  protected void onRestoreInstanceState(Bundle savedInstanceState) {
//      super.onRestoreInstanceState(savedInstanceState);
//      currentColor = savedInstanceState.getInt("currentColor");
//      changeColor(currentColor);
//  }// private Drawable.Callback drawableCallback = new Drawable.Callback() {
//      @Override
//      public void invalidateDrawable(Drawable who) {
//          getActionBar().setBackgroundDrawable(who);
//      }
//
//      @Override
//      public void scheduleDrawable(Drawable who, Runnable what, long when) {
//          handler.postAtTime(what, when);
//      }
//
//      @Override
//      public void unscheduleDrawable(Drawable who, Runnable what) {
//          handler.removeCallbacks(what);
//      }
//  };public class MyPagerAdapter extends FragmentPagerAdapter {private final String[] TITLES = { "本地音乐", "网络音乐"};public MyPagerAdapter(FragmentManager fm) {super(fm);}@Overridepublic CharSequence getPageTitle(int position) {return TITLES[position];}@Overridepublic int getCount() {return TITLES.length;}@Overridepublic Fragment getItem(int position) {//return SuperAwesomeCardFragment.newInstance(position);if(position==0){System.out.println("MainActivity.MyPagerAdapter.position==0");if(myMusicListFragment==null){myMusicListFragment = MyMusicListFragment.newInstance();}return myMusicListFragment;}else if (position == 1){System.out.println("MainActivity.MyPagerAdapter.position==1");if(netMusicListFragment==null){netMusicListFragment = NetMusicListFragment.newInstance();}return netMusicListFragment;}return null;//return MyMusicListFragment.newInstance();}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {//填充菜单getMenuInflater().inflate(R.menu.main_menu,menu);return true;}public boolean onOptionsItemSelected(MenuItem item){//菜单中事件switch (item.getItemId()){case R.id.newMyMusic:myMusicListFragment.loadData();//初始化数据myMusicListFragment.newInstance();//重新实例化一下本地音乐Fragment,加载新的数据System.out.println("刷新");break;case R.id.ilove:Intent intent = new Intent(this,MyLoveMusicActivity.class);startActivity(intent);System.out.println("我的收藏");break;case R.id.near_play:Intent intent2 = new Intent(this,MyRecordMusicActivity.class);startActivity(intent2);System.out.println("最近播放");break;}return true;}@Overrideprotected void onDestroy() {super.onDestroy();//保存当前播放的一些状态值DRMPlayerApp app = (DRMPlayerApp) getApplication();SharedPreferences.Editor editor = app.sp.edit();//保存 当前正在播放的歌曲的位置editor.putInt("currentPosition",playService.getCurrentPosition());//保存 播放模式editor.putInt("play_mode",playService.getPlay_mode());//保存 提交editor.commit();//创建DRMPlayerApp继承Application,同时需要在把AndroidManiFest中的public换成DRMPlayerApp//在DRMPlayerApp的onCreate中 实例化 SharedPreferences//在MainActivity的onDestroy中 保存状态值//在PlayService的onCreate中 恢复状态值}
}
欢迎移动开发爱好者交流
沈阳或周边城市公司有意开发Android,请与我联系
联系方式

微信:iwanghang
QQ:413711276
邮箱:iwanghang@qq.com

转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51448597

项目源码(打赏5积分请点这边):http://download.csdn.net/detail/iwanghang/9524502

项目源码(免积分下载请点这边):http://download.csdn.net/detail/iwanghang/9682928

Android开发本地及网络Mp3音乐播放器系列博文汇总:
Android开发本地及网络Mp3音乐播放器(一)前言
Android开发本地及网络Mp3音乐播放器(二)SplashActivity(欢迎界面)
Android开发本地及网络Mp3音乐播放器(三)MainActivity(主界面)
Android开发本地及网络Mp3音乐播放器(四)实现音乐播放
Android开发本地及网络Mp3音乐播放器(五)实现专辑封面图片
Android开发本地及网络Mp3音乐播放器(六)实现独立音乐播放界面
Android开发本地及网络Mp3音乐播放器(七)循环模式与专辑倒影
Android开发本地及网络Mp3音乐播放器(八)状态存取与界面滑动
Android开发本地及网络Mp3音乐播放器(九)音乐收藏与列表切换
Android开发本地及网络Mp3音乐播放器(十)最近播放界面与数据保存更新
Android开发本地及网络Mp3音乐播放器(十一)使用Jsoup组件请求网络,并解析音乐数据
Android开发本地及网络Mp3音乐播放器(十二)创建NetMusicListAdapter、SearchResult显示网络音乐列表
Android开发本地及网络Mp3音乐播放器(十三)网络音乐搜索功能实现,歌名歌手专辑名搜索
Android开发本地及网络Mp3音乐播放器(十四)网络音乐下载功能实现
Android开发本地及网络Mp3音乐播放器(十五)网络音乐及歌词下载功能实现
Android开发本地及网络Mp3音乐播放器(十六)歌词显示及滚动事件实现、ViewPager使用
Android开发本地及网络Mp3音乐播放器(十七)已存在歌曲歌词下载
Android开发本地及网络Mp3音乐播放器(十八)新下载歌曲加载准备SdcardSearchToList
Android开发本地及网络Mp3音乐播放器(十九)通知媒体库更新刚下载的MP3
Android开发本地及网络Mp3音乐播放器(二十)歌曲下载完成后通知主界面更新本地音乐

觉得博文有用,请点赞,请留言,请关注,谢谢!~

Android开发本地及网络Mp3音乐播放器(二十)歌曲下载完成后通知主界面更新本地音乐相关推荐

  1. Android开发本地及网络Mp3音乐播放器(十二)创建NetMusicListAdapter、SearchResult显示网络音乐列表

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51290181 觉得博文有用,请点赞,请留言,请关注,谢谢!~ 实现功能: 实现NetM ...

  2. Android开发本地及网络Mp3音乐播放器(十三)网络音乐搜索功能实现,歌名歌手专辑名搜索

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51298411 觉得博文有用,请点赞,请留言,请关注,谢谢!~ 实现功能: 实现网络音乐 ...

  3. Android:简单音乐播放器,实现歌曲列表显示,播放暂停,切歌等功能

    效果截图(大作业不建议用,太简单了) 源码下载 简单音乐播放器

  4. AIMP(高品质电脑音乐播放器)官方中文版V5.00.2334 | 电脑上音质最好的音乐播放器 | aimp播放器中文版下载

    AIMP播放器中文版是来自战斗民族俄罗斯的一款完全免费的顶级电脑音乐播放器软件,开发至今已有长达15年的历史,支持本地文件.NAS.云和播客以及32位音频处理的功能,全面兼容MP1..MP2..MP3 ...

  5. 安卓Service实现通知栏音乐播放器,切换歌曲,类似QQ音乐

    引言: 这样的一个音乐播放器,用到了安卓四大组件的其中三个,等于说是一个比较综合性的小功能.实现方法其实有很多,我这里给出自己的方法,不喜勿喷. 需求分析 1.音乐播放器,那我们需要一个帮助类,来构建 ...

  6. linux播放器安装程序,Linux下音乐播放器Audacious 3.10下载与安装

    一款Linux下的音乐播放器Audacious 3.10正式发布下载了,它带来了新的功能和一些重要改进,尽管Audacious 4.0(具有功能齐全的 Qt UI)还没有开发出来,但他们也没有闲着,代 ...

  7. 依米花音乐播放器php源码下载

    仿依米花音乐播放器是一款简约的HTML悬浮音乐播放器,免费分享和之前分享的绚丽彩虹在线音乐播放器生成源码差不多,功能界面都是大同小异的.这款依米花音乐播放器php源码支持网易云/QQ音乐,可搭建类是与 ...

  8. ehshig蒙文歌曲_额格希格音乐播放器_额格希格音乐播放器安卓版下载_额格希格音乐播放器最新版app下载_好趣手游网...

    额格希格蒙语版是一款颇具民族特色的蒙文歌曲下载软件.额格希格音乐播放器收集了最全的蒙文歌曲曲库,各种经典的蒙文歌曲以及当前流行的蒙文流行歌全都有,深受广大内蒙用户喜爱! 软件介绍 想了解蒙语音乐或者想 ...

  9. python可视化音乐播放器(pyqt5+多平台下载)

    1.主要功能 实现一个python可视化音乐播放器,用的是pyqt5,主要是三个平台获取,一个是网易云音乐,一个是酷我音乐,一个是酷狗音乐者三个平台获取音乐,能够进行下载,然后进行播放,具备网页获取的 ...

最新文章

  1. 新生命 · 人工智能 · 未来
  2. CF56E Domino Principle 树状数组 + 简单dp
  3. 【THUSC2018】史莱姆之友【长链剖分】【链分治NTT】
  4. raspberry pi_构建自己的Raspberry Pi龙卷风预警系统
  5. 轻轻一扫立刻扣款,付款码技术原理大揭秘 | 原力计划
  6. CA7 ROLL B 选项
  7. 苹果电脑取色器怎么用?Mac取色器——为你的设计提提速
  8. qt的opengl开发(qopenglwidget)(初始化,画线,平移,局部缩放)2d开发
  9. NX二次开发-BlockUI对话框嵌套MFC对话框制作进度条
  10. emoji语言抽象话大全_emoji抽象话生成器
  11. 基于Maven的SSM总体架构设计(四)
  12. Windows10蓝屏提示错误操作Wdwifi.sys
  13. 实变函数(4)--Lebesgue积分
  14. Android 贝塞尔曲线实战之网易云音乐鲸云特效
  15. Golang 多版本管理
  16. 舟山景区概况 舟山旅游项目介绍
  17. c语言中优先级劣后级,基金优先级与劣后级的区别是什么 看完你就明白了
  18. Anima2D官方中文使用手册(对应Anima2D1.1.4)
  19. pyechart中15种中国地图,世界地图可视化代码模板, 最适合放在ppt中
  20. Mac 安装BurpSuite2021.6

热门文章

  1. GitChat·管理 | 一篇文章读懂项目管理中的精髓
  2. HTML之表格,表单的使用
  3. ipv4v6双栈技术_IPv4/IPv6双栈网络
  4. IO到NIO的前因后果,以及NIO的用法(2)——Selector、Channel
  5. Snapchat发布不到2个月的故事搜索功能,又双叒被Instagram抄袭了
  6. [树形DP | Uva 1218]Perfect Service
  7. 博通wifi 芯片配置工具wl 详解
  8. 人民币(RMB)小写/数字转换大写工具类,精确到分,修复‘圆零零’为‘圆整’,修复科学计数法处理异常。
  9. 【计算机研究与发展】一种基于区块链的泛用型数据隐私保护的安全多方计算协议——CCF A
  10. ACM解题的一些技巧和方法