上一篇智能厨房重构-使用Bmob后端云实现用户注册登录的功能,初步介绍了Bmob的一些简单用法,现在我们来介绍一下稍微高级的东西,实现朋友圈的功能。上一篇我们已经实现了用户注册的功能,现在我们就要让这些用户能够分享自己制作美食的经历,增加用户的分享乐趣。

1. 服务器建表

看过上一篇博客的都应该知道了,我们要想让服务器支持上传下载查询等基本功能,都是建立在服务器已经存在对象表的基础上面的。我们先来分析一下数据结构,一个说说应该包含这些属性:

1.用户资料 这就对应我们之前建立好的用户表,设为外键即可

2.说说的文字部分 这就对应着一个String类型

3.说说的图片部分 这就对应着一个List 文件组合

分析完了之后建好的表就是这样的。

2. 客户端建立对应的对象

/*** 作者:GXL on 2016/8/3 0003* 博客: http://blog.csdn.net/u014316462* 作用:动态圈Item*/
public class DynamicItem extends BmobObject implements Serializable{public User getWriter() {return Writer;}public void setWriter(User writer) {Writer = writer;}public User Writer;//作者描述public String Text;//作者上传图片集合public List<BmobFile> PhotoList;//作者描述文字public String Detail;public String getText() {return Text;}public void setText(String text) {Text = text;}public List<BmobFile> getPhotoList() {return PhotoList;}public void setPhotoList(List<BmobFile> photoList) {PhotoList = photoList;}public String getDetail() {return Detail;}public void setDetail(String detail) {Detail = detail;}
}

一条DynamicItem记录对应着User中的一条记录,通过这个属性这两个表建立联系。

注意点 Bmob上传文件组的方法,比如就上传上面一条朋友圈,一定要先将朋友圈中的图片文件都先上传上去,然后再上传成功的回调中,将上传成功的文件UrlList,设置给朋友圈对象,最后在上传朋友圈对象,相当于要经历两次上传的过程。看一下代码:

/*** 上传动态** @param dynamicitem*/public void sendDynamicItem(final DynamicItem dynamicitem, final FoodModelImpl.BaseListener listener) {if (dynamicitem.getPhotoList().size() != 0) {final String[] array = new String[dynamicitem.getPhotoList().size()];for (int i = 0; i < dynamicitem.getPhotoList().size(); i++) {array[i] = dynamicitem.getPhotoList().get(i).getLocalFile().getAbsolutePath();Log.i("path", "sendDynamicItem: " + array[i] + " " + dynamicitem.getPhotoList().size());}BmobFile.uploadBatch(BaseApplication.getmContext(), array, new UploadBatchListener() {@Overridepublic void onSuccess(List<BmobFile> files, List<String> urls) {if (urls.size() == array.length) {dynamicitem.setPhotoList(files);dynamicitem.save(BaseApplication.getmContext(), new SaveListener() {@Overridepublic void onSuccess() {listener.getSuccess(null);Toast.makeText(BaseApplication.getmContext(), "上传成功", Toast.LENGTH_LONG).show();}@Overridepublic void onFailure(int i, String s) {Toast.makeText(BaseApplication.getmContext(), "上传失败", Toast.LENGTH_LONG).show();listener.getFailure();}});}}@Overridepublic void onError(int statuscode, String errormsg) {Log.i("TAG", "onError: " + errormsg + statuscode);}@Overridepublic void onProgress(int curIndex, int curPercent, int total, int totalPercent) {Log.i("TAG", "onProgress: " + curIndex + " " + curPercent + " " + total);}});} else {dynamicitem.save(BaseApplication.getmContext(), new SaveListener() {@Overridepublic void onSuccess() {listener.getSuccess(null);Toast.makeText(BaseApplication.getmContext(), "上传成功", Toast.LENGTH_LONG).show();}@Overridepublic void onFailure(int i, String s) {Toast.makeText(BaseApplication.getmContext(), "上传失败", Toast.LENGTH_LONG).show();listener.getFailure();}});}}

上面的代码的流程是这样的,首先两种情况:

  1. 当前用户发送的说说中,没有图片,那我们只需要直接上传DynamicItem对象即可。

  2. 如果当前用户发送的说说中,含有图片列表,我们就需要先上传图片文件,如果将DynamicItem的PhotoList设为返回的files.然后上传DynamicItem对象。

3. 实战

首先我们先来看一下效果图:

展示朋友圈的效果图

发送说说的效果图

效果还都可以吧!下面我简单介绍一下主要的功能代码,关于布局的展示都比较基础,感兴趣的兄弟,可以直接看github上面的源码哈。

DyanmicItem的Model类,负责所有的Dynamic的数据处理部分。

/*** 作者:GXL on 2016/8/3 0003* 博客: http://blog.csdn.net/u014316462* 作用:对朋友圈数据操作的model*/
public class DynamicModel implements DynamicModelImpl {/*** 获取所有的朋友圈消息** @param listener*/@Overridepublic void getDynamicItem(final FoodModelImpl.BaseListener listener) {BmobQuery<DynamicItem> query = new BmobQuery<DynamicItem>();query.order("-createdAt");query.findObjects(BaseApplication.getmContext(), new FindListener<DynamicItem>() {@Overridepublic void onSuccess(List<DynamicItem> object) {if (object != null && object.size() != 0) {listener.getSuccess(object);}}@Overridepublic void onError(int code, String msg) {}});}/*** 获取当前用户的所有动态** @param user* @param listener*/@Overridepublic void getDynamicItemByPhone(User user, final FoodModelImpl.BaseListener listener) {BmobQuery<DynamicItem> query = new BmobQuery<DynamicItem>();query.addWhereEqualTo("Writer", user);query.findObjects(BaseApplication.getmContext(), new FindListener<DynamicItem>() {@Overridepublic void onSuccess(List<DynamicItem> object) {if (object != null && object.size() != 0) {listener.getSuccess(object);}}@Overridepublic void onError(int code, String msg) {}});}/*** 上传动态** @param dynamicitem*/public void sendDynamicItem(final DynamicItem dynamicitem, final FoodModelImpl.BaseListener listener) {if (dynamicitem.getPhotoList().size() != 0) {final String[] array = new String[dynamicitem.getPhotoList().size()];for (int i = 0; i < dynamicitem.getPhotoList().size(); i++) {array[i] = dynamicitem.getPhotoList().get(i).getLocalFile().getAbsolutePath();Log.i("path", "sendDynamicItem: " + array[i] + " " + dynamicitem.getPhotoList().size());}BmobFile.uploadBatch(BaseApplication.getmContext(), array, new UploadBatchListener() {@Overridepublic void onSuccess(List<BmobFile> files, List<String> urls) {if (urls.size() == array.length) {dynamicitem.setPhotoList(files);dynamicitem.save(BaseApplication.getmContext(), new SaveListener() {@Overridepublic void onSuccess() {listener.getSuccess(null);Toast.makeText(BaseApplication.getmContext(), "上传成功", Toast.LENGTH_LONG).show();}@Overridepublic void onFailure(int i, String s) {Toast.makeText(BaseApplication.getmContext(), "上传失败", Toast.LENGTH_LONG).show();listener.getFailure();}});}}@Overridepublic void onError(int statuscode, String errormsg) {Log.i("TAG", "onError: " + errormsg + statuscode);}@Overridepublic void onProgress(int curIndex, int curPercent, int total, int totalPercent) {Log.i("TAG", "onProgress: " + curIndex + " " + curPercent + " " + total);}});} else {dynamicitem.save(BaseApplication.getmContext(), new SaveListener() {@Overridepublic void onSuccess() {listener.getSuccess(null);Toast.makeText(BaseApplication.getmContext(), "上传成功", Toast.LENGTH_LONG).show();}@Overridepublic void onFailure(int i, String s) {Toast.makeText(BaseApplication.getmContext(), "上传失败", Toast.LENGTH_LONG).show();listener.getFailure();}});}}
}

所有的用途我都添加了注释,下载源码,学起来还是比较简单的。

看一下发说说的Activity,展示部分就是一个listview,如何将数据绑定到listview中没有什么好讲的了。

/*** 作者:GXL on 2016/8/3 0003* 博客: http://blog.csdn.net/u014316462* 作用:发朋友圈页面*/
public class SendDynamicActivity extends Activity {private final int REQUEST_CODE = 0x01;@Bind(R.id.cancel)TextView cancel;@Bind(R.id.send)TextView send;@Bind(R.id.edit_content)EditText editContent;@Bind(R.id.gridView)GridView gridView;private DynamicPhotoChooseAdapter mDynamicPhotoChooseAdapter;private final String LOGINUSER = "loginuser";private User mUser;private Dialog mLoadingDialog;private Dialog mLoadingFinishDialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.senddynamic_activity_main);mUser = (User) getIntent().getSerializableExtra("User");ButterKnife.bind(this);init();}public void init() {final PhotoPickerIntent intent = new PhotoPickerIntent(SendDynamicActivity.this);intent.setPhotoCount(6);intent.setShowCamera(true);mDynamicPhotoChooseAdapter = new DynamicPhotoChooseAdapter(SendDynamicActivity.this);gridView.setAdapter(mDynamicPhotoChooseAdapter);gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {if (position == mDynamicPhotoChooseAdapter.getCount() - 1) {startActivityForResult(intent, REQUEST_CODE);}}});mLoadingDialog = DialogBuilder.createLoadingDialog(SendDynamicActivity.this, "正在上传");mLoadingFinishDialog = DialogBuilder.createLoadingfinishDialog(SendDynamicActivity.this, "上传完成");}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);// 选择结果回调if (requestCode == REQUEST_CODE && resultCode == RESULT_OK && data != null) {List<String> pathList = data.getStringArrayListExtra(PhotoPickerActivity.KEY_SELECTED_PHOTOS);List<DynamicPhotoItem> list = new ArrayList<>();if (pathList.size() != 0) {for (String path : pathList) {list.add(new DynamicPhotoItem(path, false));}}mDynamicPhotoChooseAdapter.addData(list);}}@OnClick({R.id.cancel, R.id.send})public void onClick(View view) {switch (view.getId()) {case R.id.cancel:finish();break;case R.id.send:mLoadingDialog.show();DynamicItem dynamicItem = new DynamicItem();dynamicItem.setWriter(mUser);List<BmobFile> fileList = new ArrayList<>();ArrayList<DynamicPhotoItem> photoItems = (ArrayList<DynamicPhotoItem>) mDynamicPhotoChooseAdapter.getData();for (int i = 0; i < photoItems.size() - 1; i++) {fileList.add(new BmobFile(new File(photoItems.get(i).getFilePath())));}dynamicItem.setText(editContent.getText().toString());dynamicItem.setPhotoList(fileList);new DynamicModel().sendDynamicItem(dynamicItem, new FoodModelImpl.BaseListener() {@Overridepublic void getSuccess(Object o) {mLoadingDialog.dismiss();mLoadingFinishDialog.show();new Handler().postDelayed(new Runnable() {@Overridepublic void run() {mLoadingFinishDialog.dismiss();finish();}}, 500);}@Overridepublic void getFailure() {}});break;}}
}

关于获取本地手机的图片文件,还使用了一个ImageSelector框架,使用起来特别简单方便,可以让你更加专注与自身的核心功能,使用方法,在buildgradle中添加下面这行代码建立依赖。

  compile 'me.iwf.photopicker:PhotoPicker:0.1.8'

初始化

    final PhotoPickerIntent intent = new PhotoPickerIntent(SendDynamicActivity.this);intent.setPhotoCount(6);//最多选择图片的个数intent.setShowCamera(true);//是否显示相机拍照

调用

 startActivityForResult(intent, REQUEST_CODE);

获取返回的文件地址list

 @Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);// 选择结果回调if (requestCode == REQUEST_CODE && resultCode == RESULT_OK && data != null) {List<String> pathList = data.getStringArrayListExtra(PhotoPickerActivity.KEY_SELECTED_PHOTOS);}}

实现朋友圈功能的核心代码和步骤基本都在上面了,因为自己水平问题可能讲解有点贴代码了,但是基本的思想就是如此,大家多看一遍必定可以理解,下一篇我们将介绍一个使用vitamio打造属于自己的美食视频教学功能。
详细的项目代码地址:https://github.com/gxl1240779189/ReIntelligentKitchen

智能厨房重构-使用Bmob后端云实现朋友圈的功能相关推荐

  1. Android实战——第三方服务之Bmob后端云的推送服务的集成和使用(三)

    第三方服务之Bmob后端云的推送服务的集成和使用(三) 事先说明:这里的一切操作都是在集成了BmobSDK之后实现的,如果对Bmob还不了解的话,请关注我第一篇Bmob文章 步骤一:推送服务的集成 在 ...

  2. android bmob获取数据,Android基于bmob后端云实现数据读取

    最近在上手一个app作为练手,是关于失物招领的,其中要实现的一个功能是从云端读取数据展示在app的listview当中,其实这个功能挺常见的,不过这里还是拿来分享一下,主要介绍我解决的过程以及思路. ...

  3. Bmob关联Android,Android如何使用Bmob后端云实现失物招领功能

    最近在使用后端云Bmob对数据进行存储,目的是在不搭建服务器的前提下,能对Android应用的数据进行操作处理,其实这篇是比较久之前写的了,有些童鞋反馈说现在的源码会有问题,所以我又重新运行了一下,随 ...

  4. Android实战——第三方服务之Bmob后端云的答题系统小项目(四)

    第三方服务之Bmob后端云的答题系统小项目(四) 事先说明:这里的一切操作都是在集成了BmobSDK之后实现的,如果对Bmob还不了解的话,请关注我第一篇Bmob文章 项目意义: 该项目实现简单,比较 ...

  5. Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能

    Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...

  6. Bmob后端云——私人云数据库

    Bmob 后端云的配置使用 一.前言     数据库的使用非常广泛,各大语言都存在于数据库的连接交互,以便数据的操作处理.自己配置数据库较麻烦且没必要,个人开发者自己安装数据库较占内存,个人不常用,数 ...

  7. 基于bmob后端云小程序开发——口袋吉他

    人的一生90%的时间都在做着无聊的事情,社会的发展使得我们的闲暇时间越来越多,我们把除了工作的其他时间放在各种娱乐活动上. 程序员有点特殊,他们把敲代码看成娱乐活动的一部分,以此打发时间的不占少数.这 ...

  8. Android基于Bmob后端云实现注册、登陆、找回密码、短信验证码

    注重版权,转载请注明原作者和原文链接 作者:Bald programmer 文章目录 整体功能展示 创建应用 配置Bmob 前期准备 一.数据表 二.工具类 代码设计 一.注册模块 二.登陆模块 三. ...

  9. Android实战——第三方服务之Bmob后端云的集成、用户登陆、用户注册、获取用户、用户注销(一)

    第三方服务之Bmob后端云的集成.用户登陆.用户注册.获取用户.用户注销(一) Bmob简介: 步骤一:Bmob集成 在www.bmob.cn注册一个用户,在网站后台创建一个应用,进去管理页面之后在设 ...

最新文章

  1. 操作系统 作业调度实验报告
  2. Linux下使用dmidecode查看服务器的详细的硬件配置
  3. 第十六届全国大学智能汽车竞赛竞速比赛规则
  4. Oracle11g与Oracle11gxe有什么区别
  5. JQuery操作CheckBox和Radio
  6. 全球及中国儿童滑步车市场销量需求调查与竞争格局展望报告2022年
  7. 几种常见的Shell
  8. SVM(四)KSVM
  9. DFS深搜与BFS广搜专题
  10. Django 报错 ‘polls‘ is not a registered namespace
  11. 安装与配置Flutter开发环境
  12. 最新的Functions 类
  13. h5将数字翻译为大写汉字_将阿拉伯数字翻译成中文的大写数字
  14. VB.net WinForm如何写一个分线程进度条
  15. 4款超好用的时间轴制作软件
  16. 深度时空3D卷积神经网络用于交通预测
  17. 18讲项目实战签证详细页
  18. iOS-高德地图点击地图获取点击点对应的地理位置,并添加自定义的大头针
  19. OPENMP学习笔记(1)——简介,模型,运行
  20. 解决Windows开机后无启动项的问题

热门文章

  1. 在多元宇宙中,SAS探索下一代数据分析的生产力
  2. 计算机软件考研英语,(完整版)计算机软件专业考研英语面试必备问题解析
  3. pdf.js清晰度提升办法
  4. 广东工业大学控制工程考研
  5. go的string正则匹配_基础知识 - Golang 中的正则表达式
  6. WordPress环境搭建
  7. 西游记[非常的搞笑.是不容错过的精彩片子]
  8. 常用input输入限制数字,汉字,英文字母等
  9. 推荐一个李建忠老师创办的网站 -- Boolan(关注经典技术书籍)
  10. Vue.js中“{{}}”的用法