前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >浅谈安卓中的MVP模式

浅谈安卓中的MVP模式

作者头像
老马的编程之旅
发布于 2022-06-22 01:45:44
发布于 2022-06-22 01:45:44
1.1K00
代码可运行
举报
文章被收录于专栏:深入理解Android深入理解Android
运行总次数:0
代码可运行

端午放假,天气下雨,于是乎在家撸一下博客,本篇博客将为大家解析MVP模式在安卓中的应用。

本文将从以下几个方面对MVP模式进行讲解:

1.  MVP简介

2.  为什么使用MVP模式

3.  MVP模式实例 4.  MVP中的内存泄露问题 1.  MVP简介:

随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责。为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Model只关系数据的处理,基于MVC概念的MVP(Model-View-Presenter)模式应运而生。

在MVP模式里通常包含4个要素:

(1)View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity);

(2)ViewInterface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试;

(3)Model:负责存储、检索、操纵数据(有时也实现一个Modelinterface用来降低耦合);

(4)Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。

2.  为什么使用MVP模式

在Android开发中,Activity并不是一个标准的MVC模式中的Controller,它的首要职责是加载应用的布局和初始化用户界面,并接受并处理来自用户的操作请求,进而作出响应。随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致变得庞大臃肿。当我们将其中复杂的逻辑处理移至另外的一个类(Presneter)中时,Activity其实就是MVP模式中 View,它负责UI元素的初始化,建立UI元素与Presenter的关联(Listener之类),同时自己也会处理一些简单的逻辑(复杂的逻辑交由 Presenter处理).

另外,回想一下你在开发Android应用时是如何对代码逻辑进行单元测试的?是否每次都要将应用部署到Android模拟器或真机上,然后通过模拟用户操作进行测试?然而由于Android平台的特性,每次部署都耗费了大量的时间,这直接导致开发效率的降低。而在MVP模式中,处理复杂逻辑的 Presenter是通过interface与View(Activity)进行交互的,这说明了什么?说明我们可以通过自定义类实现这个 interface来模拟Activity的行为对Presenter进行单元测试,省去了大量的部署及测试的时间。

3.  MVP模式实例 好了,大致了解了MVP模式的基本概念之后,我们就使用MVP模式来写一个小例子。

包的结构如下图所示:                    效果展示:

下面开始讲解mvp模式的步骤:

1) 创建view的接口类,根据业务定义抽象方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span style="font-size:18px;">public interface IUserView {
	//显示进度条
	void showLoading();
	//展示用户数据
	void showUser(List<User> users);
	
}</span>

2) 创建model的接口类,根据业务定义抽象方法

其中定一个加载数据的方法,同时设置一个加载完成的监听,监听内设置抽象方法complete,用于加载完成后进行回调

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface IUserModel {
	//加载用户信息的方法
	void loadUser(UserLoadListenner listener);
	//加载完成的回调
	interface UserLoadListenner{
		void complete(List<User> users);
	}
}

3)创建model的实现类,实现其中抽象方法,其中的user类是在bean包根据需求自行创建的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UserModelImpl implements IUserModel{

	@Override
	public void loadUser(UserLoadListenner listener) {
		//模拟加载本地数据
		List<User> users = new ArrayList<User>();
		users.add(new User("姚明", "我很高", R.drawable.ic_launcher));
		users.add(new User("科比", "怒砍81分", R.drawable.ic_launcher));
		users.add(new User("詹姆斯", "我是宇宙第一", R.drawable.ic_launcher));
		users.add(new User("库里", "三分我最强", R.drawable.ic_launcher));
		users.add(new User("杜兰特", "千年老二", R.drawable.ic_launcher));
		if(listener != null){
			listener.complete(users);
		}
	}
	
}

加载完数据,回调listener中的complete方法。

4) 创建present,在构造函数传入view的实现类,同时在其中new出model的实现类,创建一个方法load,实现view与model间通信的桥梁。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Presenter1 {
	//view
	IUserView mUserView;
	//model
	IUserModel mUserModel = new UserModelImpl();
	//ͨ通过构造函数传入view
	public Presenter1(IUserView mUserView) {
		super();
		this.mUserView = mUserView;
	}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//加载数据
	public void load() {
		//加载进度条
		mUserView.showLoading();
		//model进行数据获取
		if(mUserModel != null){
			mUserModel.loadUser(new UserLoadListenner() {
				
				@Override
				public void complete(List<User> users) {
					// 数据加载完后进行回调,交给view进行展示
					mUserView.showUser(users);
					
				}
			});
		}
		
	}

Load中,先调用mUserView.showLoading() 显示加载进度,然后是调用mUserModel.loadUser加载数据,其中要实现Listenner的complete方法,其中的逻辑就是用view将数据显示到界面,model的最后会回调listener中的complete方法,数据就显示在界面上了。

5) MainActivity显然是用来显示数据的,其中有一个listview,创建与其相关的两个布局文件activity_main.xml与item_user.xml,令MainActivity实现IUserView接口,并实现两个抽象方法,创建listview的适配器,重写构造函数,并利用viewHolder,复用convertView对其进行优化,最后创建Presenter,并调用其load方法,完成加载所有逻辑。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<pre name="code" class="java">public class MainActivity extends ActionBarActivity implements IUserView  {

    private ListView mListView;
	
	

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mListView = (ListView) findViewById(R.id.lv);      
        new Presenter1(this).load();
        
    }
    
	
	public void showUser(List<User> users) {
		//显示所有用户列表
		mListView.setAdapter(new UserAdapter(this,users));
	}

	@Override
	public void showLoading() {
		
		Toast.makeText(this, "正在拼命加载中", Toast.LENGTH_SHORT).show();
	}
}
代码语言:javascript
代码运行次数:0
运行
复制

适配器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class UserAdapter extends BaseAdapter {

	private Context context;
	private List<User> users;

	public UserAdapter(Context context, List<User> users) {
		this.context = context;
		this.users = users;
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return users.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return users.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		LayoutInflater inflater = LayoutInflater.from(context);
		ViewHolder viewHolder = null;
		//convertView
		if (convertView == null) {
			convertView = inflater.inflate(R.layout.item_user, null);
			viewHolder = new ViewHolder();
			viewHolder.image = (ImageView) convertView
					.findViewById(R.id.iv_user);
			viewHolder.name = (TextView) convertView.findViewById(R.id.tv_name);
			viewHolder.content = (TextView) convertView
					.findViewById(R.id.tv_content);
			convertView.setTag(viewHolder);
		}else{
			viewHolder = (ViewHolder) convertView.getTag();
		}
		
		viewHolder.image.setImageResource(users.get(position).getPicid());
		viewHolder.name.setText(users.get(position).getName());
		viewHolder.content.setText(users.get(position).getContent());
		return convertView;
	}

	private static class ViewHolder {
		ImageView image;
		TextView name;
		TextView content;
	}

}

这样,我们的小例子就写完了,效果如下:

体会MVP模式的优越性:

a) 假设我们不从本地获取用户数据了,改成从网络获取,只需要从新写一个model的实现类,并new 一个present,并在MainActivity中进行替换,就可以解决,我们模拟一下这种情况,发现修改十分方便,主界面建议使用MVP模式,它很好遵守了开闭原则。

b) 假设我不想用listview显示数据,想换成gridview,无需修改原来代码,只需要新建一个新的Activity来实现view,实现接口方法,同时使用gridview与新建一个与其对应的adapter即可,符合了开闭原则,不修改源码,而是进行扩展性修改。View与model解耦,可以发现我们写的Activity里面都是没有model的影子的,只有presenter.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class GridActivity extends MvpBaseActivity<IUserView, GridPresenter> implements IUserView{
	 private GridView mGridView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_grid);
		mGridView = (GridView) findViewById(R.id.gv);
		mPresenter.load();
	}

	@Override
	public void showLoading() {
		// TODO Auto-generated method stub
		Toast.makeText(this, "正在拼命加载中", Toast.LENGTH_SHORT).show();
	}

	@Override
	public void showUser(List<User> users) {
		// TODO Auto-generated method stub
		mGridView.setAdapter(new UserAdapter(this,users));
	}

	@Override
	protected GridPresenter createPresenter() {
		// TODO Auto-generated method stub
		
		return new GridPresenter();
	}

}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Presenter2 {
	//view
	IUserView mUserView;
	//model
	IUserModel mUserModel = new UserModelImpl2();
	//ͨ通过构造函数传入view
	public Presenter2(IUserView mUserView) {
		super();
		this.mUserView = mUserView;
	}
	//加载数据
	public void load() {
		//加载进度条
		mUserView.showLoading();
		//model进行数据获取
		if(mUserModel != null){
			mUserModel.loadUser(new UserLoadListenner() {
				
				@Override
				public void complete(List<User> users) {
					// 数据加载完后进行回调,交给view进行展示
					mUserView.showUser(users);
					
				}
			});
		}
		
	}
	
}

4)MVP中的内存泄露问题

发现我们之前写的两个Acitivty有共性的地方,就是都new 了present,我们对代码进行抽取,提高代码的复用性。

在各个Activitty中Presenter有很多类型,所以在BaseActivitty中,也需要对Presenter进行抽取成BasePresenter,MVP中Presenter是持有view的引用的,所以BasePresenter中使用泛型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class BasePresenter<T> {
	
}

在BaseActivitty中,Presenter的具体类型交给子类去确定,我们只提供一个生成Presenter的方法,这里多次用到了泛型,需要注意

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class MvpBaseActivity<V,T extends BasePresenter<V>> extends ActionBarActivity {
	protected T mPresenter;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		//创建presenter
		mPresenter = createPresenter();
		//内存泄露
		//关联View
		mPresenter.attachView((V) this);
	}

	protected abstract  T createPresenter();
	
}

内存泄露分析:加入Model在请求网络加载数据,此时假设Activity由于内存不足,被GC回收,但是网络加载还未完成,则Presenter还存在,并持有Activity的引用,当网络加载数据完成,Presenter会使用Activity进行数据展现,而此时Activity已被回收,就发生了内存泄露,会报错,所以解决方法是:当view被回收,Presenter要解除与其的关联。

既然是Presenter解除与view的关联,那关联与解除的逻辑肯定是在Presenter中,使用弱引用包裹view,理由是,使用弱引用,当GC扫描到的时候,就会立即回收。所以对BasePresenter进行如下的修改:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class BasePresenter<T> {
	//当内存不足,释放内存
	protected WeakReference<T> mViewReference;

创建关联和解除关联的方法:

进行关联的逻辑:创建弱引用,并包裹view

解除关联的逻辑:判断,如果弱引用不为空,清空弱引用,并设置为空,彻底释放

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//进行关联
	public void attachView(T view) {
		mViewReference = new WeakReference<T>(view);
	}
	//解除关联
	public void detachView() {
		if(mViewReference != null){
			mViewReference.clear();
			mViewReference = null;
		}
	}

暴露一个方法,用于其他类从弱引用中取出view

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected T getView() {
		
		return mViewReference.get();
		
	}

GridPresenter继承BasePresenter,进行对象抽象方法的实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class GridPresenter extends BasePresenter<IUserView>{
	//view
	//IUserView mUserView;
	//model
	IUserModel mUserModel = new UserModelImpl();

	/*public GridPresenter(IUserView mUserView) {
		super();
		this.mUserView = mUserView;
	}*/
	//加载数据
	public void load() {
		//加载进度条
		//mUserView.showLoading();
		getView().showLoading();
		//model进行数据获取
		if(mUserModel != null){
			mUserModel.loadUser(new UserLoadListenner() {
				
				@Override
				public void complete(List<User> users) {
					// 数据加载完后进行回调,交给view进行展示
					//mUserView.showUser(users);
					getView().showUser(users);
					
				}
			});
		}
		
	}
	
}

然后对BaseActivity进行修改:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class MvpBaseActivity<V,T extends BasePresenter<V>> extends ActionBarActivity {
	protected T mPresenter;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		//创建presenter
		mPresenter = createPresenter();
		//内存泄露
		//关联View
		mPresenter.attachView((V) this);
	}

	protected abstract  T createPresenter();
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		mPresenter.detachView();
	}
}

oncreate方法中关联view,onDestroy方法中对关联进行清除,所有关于内存泄露的逻辑就完成了,好了,对MVP模式的分析到此就结束了,更多的应用得大家自己在项目中对该模式进行运用,并不断进行总结。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
末次触达归因的挑战与突破:从“单点归因”到“全局视角”的进化
在数字营销的激烈竞争中,广告主的核心目标始终是优化广告支出回报率(ROAS),最大化每一笔预算的价值。然而,随着消费者决策路径的复杂化、隐私政策的收紧以及渠道触点的多元化,传统的末次触达归因(Last Touch Attribution, LTA)模型逐渐显露出其局限性。LTA的单一归因逻辑——将转化功劳100%归于用户下单前的最后一个触点——已难以全面反映消费者从认知到购买的全旅程。正如广告大师大卫·奥格威所言:“我们做广告的目的就是为了销售,否则就不做广告。”但LTA的“最后一击”思维,可能让品牌错失非直接销售的长期价值。本文将深入探讨LTA的局限性,分析其归因陷阱,并提出突破路径,帮助广告主从“流量思维”跃迁至“价值思维”。
jack.yang
2025/05/28
1280
【腾讯报告解读】教你如何洞察下一个社交零售大趋势?
本次解读的是2020 TMI腾讯营销洞察与BCG联合发布的中国“社交零售”联合报告,其中介绍了中国社交零售的背景、消费者社交零售⾏为洞察、七⼤⾏业社交零售战略的分析以及社交零售趋势对品牌公司的意义。
iCDO互联网数据官
2021/05/28
7830
【腾讯报告解读】教你如何洞察下一个社交零售大趋势?
2016数字营销趋势:转型和颠覆
作者| 栗建(陶氏化学亚太区数字营销负责人) 转自| 微信公众号“CMO俱乐部” 关于数字营销趋势,绝大多数懂行的机构和专家已经不再局限于某一种平台或者技术的分析,而把目光放在了更核心的消费趋势和数字转型研究上。 内容营销、营销自动化、原生广告以及程序化购买等过去被认为是「营销趋势」的东西慢慢地降格为「营销工具」。Chiefmartech.com 统计的主流营销工具已经超过了 42 个大类(诸如「内容营销」和「程序化购买」这样的大类)2000 种了,而且还不包括「虚拟现实营销」这类新玩意。 相比营销手段和工
大数据文摘
2018/05/23
7470
探寻未来趋势 --- 数字化创新与营销的明天在哪里?
引言:本文介绍了将成为2018及以后数字领域继续发展的基础创新趋势。 翻译 | 张雨新 审校 | 王楠楠 编辑 | Rachel 无论您已投身数字营销的世界中,还是仍在观望,数字营销门类繁多且不断变化,都需紧随趋势。如此不仅于我们个人而言是一种好的做法,还能对所涉及的客户和企业有所帮助。 2018年我们专注于UX在数字营销领域的全新升级,重点包括客户体验,功能性,关键决策点,高定向广告。这些创新大多数通过人工智能的使用而不断完善。以下是一些令人兴奋的重要趋势,数字营销人员应该密切关注并思考如何将其融入自身
iCDO互联网数据官
2018/03/27
1.2K0
高端市场联动“颜值经济”,个性化圈层营销如何赋能美妆行业?
国民整体收入的增长,催发了新世代消费力与互联网的并行发展,衍生了追逐个性潮流、生活品质、关注颜值的特性,颜值经济生态圈的不断丰富化加剧了人们关于颜值的刚性需求,对于美貌的追求也愈加高端精细化,强调个性化的颜值经济拉动高端消费能力的释放,正成为互联网产业的又一风口。
盈鱼MA
2020/12/18
7780
高端市场联动“颜值经济”,个性化圈层营销如何赋能美妆行业?
5个原因为你解释:为何没人愿意参与你的社交帖子互动?(附解决方案)
引言:2018年,如果你的社交媒体策略没有与你的内容策略相结合,那你就落后了。10%的专业营销人员将社交媒体营销作为最可能在2018年获得丰厚回报的策略,赶紧follow下文~
iCDO互联网数据官
2018/10/25
1.1K0
5个原因为你解释:为何没人愿意参与你的社交帖子互动?(附解决方案)
国外专家预测2018年18大营销趋势:车内广告将成为营销新渠道
企鹅号小编
2017/12/25
9120
国外专家预测2018年18大营销趋势:车内广告将成为营销新渠道
2019年,这11个数字营销趋势不容忽视!
引言:本文详细介绍了在2019年里,随着SEO、社交媒体、PPC等数字营销格局发生巨大变化,目前出现的最新且不容忽视的11个数字营销趋势。
iCDO互联网数据官
2019/03/07
1.9K0
2019年,这11个数字营销趋势不容忽视!
一年暴涨三倍多,微博扭转颓势的诀窍是这两个字
近日微博发布2016年Q4和全年财报,正如各界预期,微博财报数据表现继续亮眼。四季度净营收较上年同期增长43%,至2.127亿美元;归属于微博的净利润较上年同期增长134%,至7700万美元。2016年净营收6.558亿美元,较上年增长37%;归属于微博的净利润较上年度增长167%至1.835亿美元。 回望过去一年,微博股价已经涨了三倍有余,这可能是很多人都未曾预料到的结果。汽车之家创始人李想在两周前的微博对微博团队的表现表示感谢,或许更多微博投资者有这种心态:过去一年翻了两三倍的中概股只有三家:微博、网易
罗超频道
2018/04/26
6450
一年暴涨三倍多,微博扭转颓势的诀窍是这两个字
奇瑞捷豹路虎、五谷磨房、何兴华、新潮传媒、KAWO |2022第十届TopDigital创新营销盛典首批演讲嘉宾重磅揭晓
2022第十届TopDigital创新营销盛典倒计时9天! 今年是TopDigital创新营销盛典走过的第10个春夏秋冬。回首九年光阴,TopDigital创新营销盛典持续聚焦品牌与营销、产品与技术、人物和观点的创新成果及创新价值传递,始终坚守在行业第一线,捕捉行业最新动态,挖掘行业年度标杆作品和人物,呈现行业发展趋势。 2022年7月14日,第十届TopDigital创新营销盛典将在上海隆重举行!本届峰会的主题为“新十年·智营未来”,我们将携手全球各地近千家创新型企业、数百名营销行业大咖嘉宾,共同碰撞思
iCDO互联网数据官
2022/07/07
6330
奇瑞捷豹路虎、五谷磨房、何兴华、新潮传媒、KAWO |2022第十届TopDigital创新营销盛典首批演讲嘉宾重磅揭晓
【推荐】2016年文本、语义、社交分析十大趋势
大数据时代,文本、语义和社交分析就像企业的“天眼”,可以聆听到来自用户、患者和市场的声音。目前文本、语义和社交分析技术已经包括金融、医疗、传媒、电商在内的在多个行业得到广泛应用,企业从海量的互联网和企业内部数据,包括文本、视频等结构化和非结构化数据中提取那些能提高决策质量的有用信息和情报。 但是,文本、语义和社交分析技术依然处于成长期,在一些领域,例如数据分析和市场研究方面的应用还只是刚刚起步,而在相对成熟的领域,例如用户体验、社交聆听和用户互动方面,还有很大的提升空间。 总之,文本、语义和社交分析技术
小莹莹
2018/04/23
8030
【推荐】2016年文本、语义、社交分析十大趋势
手把手教你如何利用“社交媒体分析学”挖掘潜在客户
与传统媒体不同,社交媒体让信息的传播者和接受者形成互动,成为了现今互联网世界不可忽视的重要组成部分,从Facebook和Twitter这样的社交网站,到YouTube等视频网站,再到各式各样的互动百科,社交媒体与人们的生活越来越近。 举例来说,用户可以在YouTube上上传视频内容,然后回复视频的评论来与观众互动。通过社交媒体实现的这种双向交流为很多公司企业提供了宝贵机会,能够让他们与终端用户直接沟通。 本文内容目录: 1,什么是“社交媒体分析学”? 2,不同的公司是如何利用社交媒体分析学的? 3,社交媒
灯塔大数据
2018/04/08
2.7K0
手把手教你如何利用“社交媒体分析学”挖掘潜在客户
达观数据:如何利用社会化聆听挖掘有价值的商业情报(上篇)
现在,社交媒体数据挖掘领域有一个发展趋势,即客户需求逐渐由追求数据规模、浅层描述统计的舆情分析转向追求数据质量、深度挖掘信息价值的情报分析。
达观数据
2020/04/03
1.5K0
蓝色光标大数据产品会改变营销人思维方式吗?
一家名为“开干”的创业者公关服务公司近日宣布完成1200万元Pre-A轮融资,距离其天使轮融资仅三个多月,这家公司基于共享经济,将公关服务更加透明和实惠。同期中国最大的传播集团蓝色光标上线了7款大数据产品,对外启动公测。这两件事情都指向了一点:公关公司正在经历其客户所经历的一切:新技术驱动下的转型。 蓝色光标再转型:整合营销进入DT时代 蓝色光标成立于1996年,即将进入它的20个年头,这对于一家互联网色彩浓厚的公司来说已经算老资历。1996年前后中国互联网刚刚萌芽,2000年前后BAT等互联网巨头才纷纷
罗超频道
2018/04/27
1.6K0
大数据时代别说社交媒体没用,只是你没用对!
6月16日消息,在大数据营销大行其道的背景下,国内领先的跨境整合数字营销服务专家深诺互动(SinoInteractive)相关负责人有些不同的看法,他们认为海外大数据营销的转化效果无法一蹴而就,单靠Facebook、Twitter、Instagram或者Google其中的任何一个,很难立刻、直接拉升商品、品牌或平台的销量,商家需要在不同的营销阶段配合不同的媒体,从而产生协同效应。 亿邦动力网获悉,互联网以及大数据在营销界被认为是新型利器,据凯鹏华盈合伙人Mary Meeker第21次发布《互联网趋势》报告,
灯塔大数据
2018/04/09
8390
大数据时代别说社交媒体没用,只是你没用对!
忘掉10万+!那些我在美国学到的营销趋势
走进全球排名第七的公关公司Ketchum的纽约总部,出现在眼前的是一间间透明的房间。Ketchum自豪地告诉我们,那是他们的storytelling room。每天,公关人们在这里迸发无数的创意,而他们不认为自己在做的是一个个毫无情感的商业案子,而称自己为讲故事的人。不过是以生动的故事,打动着听故事的人——消费者与其他受众。 这很符合我在美国营销人身上感受到的两个字——“专注”,勤勤恳恳地耕耘数据,用传统显得较笨的办法调研消费者,精准有力地实施campaign,创造出令人惊艳的创意。10万+这样的概念,不是没有,而是没有那么引入瞩目。比起华丽的阅读量数字,我想他们关注的维度更多,更意外的朴实。 如今,中国公司面临着愈来愈多的出海机会和需求,这要求营销人们应入乡随俗,因地制宜,制定适合海外市场的战略策略。单单从美国营销er做的工作来看,就有迥然不同的趋势值得考量。
亲民创业网
2018/12/25
4510
2015年网络营销的七大趋势
福布斯中文网(微信公号: forbeschinaonline)授权转载 数字营销领域的转变和进步正在加速,对旁观者来说,要跟上恐怕有些困难。因此,就在这2014年临近年末之际,不妨让我们来回顾一下今年出现的营销趋势,并且展望一下2015年可能出现的趋势。 1. 面向移动终端的优化将会变得比以往任何时候都要重要 面向移动终端应用进行优化,在2014年已经成了企业一项至关重要的任务,但是在2015年,这种移动策略将更进一步,不再仅限于为企业设立响应式网站或开发移动应用,还将注重面向移动终端优化的内容和社交媒体
大数据文摘
2018/05/23
7720
小心陷阱!品牌营销数据管理平台(DMP)搭建风险
转自:时趣公众号(SocialTouchSCRM) 作者:王绪刚 大数据,是概念,是行业,是方法,是全社会集中讨论的新闻热点,随着大数据的不断探索,其价值被不断挖掘,展现,从而形成的新兴商业模式也引发了品牌主们的深思:数从何来?如何控制?如何利用?正是这种对流量掌控的渴望,加之对自有数据管理的需求,DMP(data management platform) 逐渐成为品牌主们争相尝试和加大投入新宠。 笔者有幸见证过几个早期DMP探索项目的成功与失败,而最近又非常巧合的连续参加了多个国内外知名品牌DMP项目的
大数据文摘
2018/05/24
1.8K0
行业方案 | 企点营销,助力汽车行业数字化转型
点击蓝字 关注企点 汽车保有量持续上升,新车销售市场竞争不断加剧,以往被市场高速增长掩盖的痛点开始显现,品牌需要更精细化的营销来获取更多客源,通过广告投放来推动销售增长。我们希望借助企点营销的全流程自动化营销,助力汽车行业数字化营销精准投放,应对新的营销挑战。 然而汽车行业在数字化转型的过程中,依然存在多个痛点,制约着行业发展。企点营销正在解决这些行业痛点: 01 多个优质渠道广告投放 超低成本获取精准流量 01 全员营销 通过全员营销系统,可以充分发挥一线4S店销售人员的社交能量,调动销售人员积极
腾讯企点
2020/06/10
2.3K0
社交媒体经理应必备哪些技能
在社交媒体盛行的年代,无论你是正在寻找从事社交媒体相关工作的机会还是正从事着与社交媒体相关的工作,以下关于社交媒体经理所必须掌握的五大技能,若你能够拥有并辅以工具,你的工作将会变得更加得心应手。
竹清
2018/08/31
9380
社交媒体经理应必备哪些技能
推荐阅读
相关推荐
末次触达归因的挑战与突破:从“单点归因”到“全局视角”的进化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档