360新闻今日头条条中的新闻如何下载到SD卡上

【图】为什么今日头条捂着直播这张好牌不打?,金兰今日头条营销助手,如何下载今日头条视频,如何申请今日头条自媒体 - 阅读新闻频道
当前位置: >
【图】为什么今日头条捂着直播这张好牌不打?时间: 11:22:37来源:搜狐媒体平台
原标题:为什么今日头条捂着直播这张好牌不打?
  7月底我在《腾讯、网易都在做的资讯直播,为什么不需要网红?》一文中断言,直播会成为各大新闻客户端标配,8月网易高调发布“天网计划”进军泛资讯直播,将从自制和PGC两个维度发力直播,并将之升级为平台战略,验证了我的断言。
  各大数据机构排名中的新闻客户端老大腾讯新闻虽尚未公布直播战略,但一直在闷声发力,对直播重视有增无减,其App中直播拥有与新闻、推荐并列的一级入口,旗下个性化资讯客户端天天快报中直播则与视频并列存在。
  然而,在网易和腾讯两家都在发力直播时,而移动资讯市场的另一个玩家,今日头条对直播却并不上心,这是完全出人意料的。
  没错,今日头条对直播不感冒
  能够证明“今日头条对直播不感冒”的有两点:
  一个是今日头条老大张一鸣最近的表态。前几天今日头条迎来了一年最重要的公开活动:头条号创作大会,在这个活动上,张一鸣宣布未来一年内将投入不少于10亿元扶持短视频创作者,并宣称今日头条已成为最大的短视频平台,每日短视频平均播放量达到10亿次。
  张一鸣在直播大潮中站出来给短视频撑腰,给了短视频平台和创作者很大的信心,毕竟,在直播红火之后,短视频就暗淡了一些,短视频标杆Papi酱也要玩直播了。
  另一个是在今日头条产品层面,直播没有任何入口。7月今日头条视频菜单下给了“火山直播”一个二级入口,这是一个做秀场的直播平台,与资讯关系不大。然而到了今天我再看时,这个入口都没了。没错,中国第二大资讯客户端(QM8月数据),没有给直播一个菜单,哪怕二级菜单都没有。
  今日头条偶尔会做一场直播,比如Papi酱直播,再比如头条号创作大会的直播,但奥运会这样的关键直播战场却是缺席的,直播并没有成为今日头条的重点。
  在“千播大战”的今天,各大新闻客户端、微博等内容消费平台,甚至淘宝、京东等电商App都在做直播时,今日头条却不发力,这很反常。
  直播这张牌可以怎么出?
  直播很火已无需赘言,眼下直播正处于白热化竞争,分为三大战场:
  第一战场是泛娱乐直播,如游戏、秀场、明星直播等等,这个阶段上演了“百播大战”,花椒、映客、斗鱼等纷纷入场,全民直播。同时也是新老并存,已有不少收割者,9158上市,YY早已凭借着直播赚得钵满盆满,这类直播还会不会有新玩家脱颖而出,有待观望。
  第二战场是直播+,即电商、资讯、社交、视频等平台推出直播频道,谋求业务与直播的结合,让直播拉动既有业务。
  电商直播变现容易,看上去像电视购物又超越电视购物,淘宝、聚划算、聚美优品等巨头纷纷入场,备受关注;
  资讯直播中则有腾讯和网易这两大玩家,并且都十分重视,凭借直播,用户活跃数得到拉升,QuestMobile数据显示腾讯新闻客户端8月DAU已达到7603万,网易新闻客户端则为2369万,都处于上升之中;
  社交直播中,微信和QQ还没发力,但陌陌在去年底做直播之后,这已成为其最大收入来源;
  直播天然就是一种视频,因此优土、乐视等平台发力直播也是水到渠成,并且优势明显。
  第三战场是综合直播,即UGC模式直播,被视作是直播领域的Twitter之战。美拍是先行者,微博是后来者,这一市场还有微信、贴吧等潜在玩家。不过微博希望最大,毕竟微博就是中国的Twitter。事实上微博二季度财报已将直播放在重要位置,并将之上升为公司级战略,希望借此实现用户数的再度攀升,有人说微博市值成功挺近百亿美金俱乐部是王宝强之功,实际上乘上了短视频和直播为主的“内容”概念的东风。
  再来看今日头条最可能加入的战场,有两个:一个是直播+,即做资讯直播,与腾讯、网易们竞争;二是综合平台,即做什么都可以直播的UGC平台,与微博、美拍竞争。就是说,今日头条要做直播,能够选择的方向有两个,做直播有着很好的牌,或者说直播是今日头条还没出的一张王牌。
  张一鸣迟迟不出牌究竟为哪般?
  今日头条艰难的二选一
  微博可以同时打短视频和直播两张牌,但今日头条就只打一张牌,张一鸣押注在短视频上。另一个谋求赴港上市的准巨头(估值50亿美元)美图秀秀旗下美拍,最开始做短视频的,现在重点做直播。谁押对了?还有待观望。结局会很有意思,短视频与直播是一起做,还是二选一,已成为资讯平台的艰难抉择。
  为什么张一鸣没有选择炙手可热的直播呢?我想主要有以下原因:
  1、今日头条在资讯直播上没有内容优势
  前面说了,今日头条做直播有两个战场可选,一个是资讯直播,与腾讯和网易竞争;另一个是综合直播,与微博、美拍竞争。如果选资讯直播,正如我之前文章所言,资讯直播是PGC的,不是靠网红,不是搞娱乐,需要专业策划,内容深度很重要。而今日头条严格意义上说并不具有媒体属性,在PGC领域不占优势。
  不论是腾讯还是网易直播均不约而同采取自制+PGC模式。腾讯还投入专业团队策划了重量级内容,比如《一个女孩的车站》、《天宫二号发射》等节目都给人留下深刻印象,这些节目是专业团队操刀策划、且投入巨资、精心准备而创作的。
  从数据来看,大部分头条号更适合做短视频,今日头条的模式天生不会重视内容自生产和自策划,而是重内容运营,逻辑就是“资讯直播需要策划和自制,而今日头条不擅长策划和自制,因此资讯直播没有优势”。
  2、今日头条在综合直播上有戏但时机不成熟
  我一直有一个观点,今日头条更像是微博,而不是腾讯新闻客户端,就是说,它更强调个性化的兴趣内容消费,而不只是资讯平台,用张一鸣的话说是“信息平台”,想做这样的平台的,还有天天快报、UC、百度贴吧等等。因此,如果做直播,今日头条更可能加入第三战场,即综合直播,不只是资讯,而是什么都可以直播的UGC类直播。
  然而,今日头条眼下更希望用户刷“碎片化”的轻量级内容,不希望用户沉浸到某一个内容中如长视频,直播。短视频这类内容,用户刷得越多,才能吃更多“豆子”,才能发挥今日头条个性化推荐的技术优势。在长短内容的选择上,微博跟今日头条是反过来的:过去是140字内的短内容,现在则突破字数限制,引入更多长内容,如视频、直播、文章的消费。
  这样看,张一鸣不发力直播逻辑就很清晰了:今日头条当前值只想做好一件事情,短视频与直播二选一,短视频基础甚好,直播还要从0到1,并且做直播更适合综合直播而不是资讯直播。不过,做综合直播,要与微博竞争不说,还与今日头条当前对短内容的亲睐、对个性化推荐的依赖形成矛盾。因为直播整体内容不够多、优质内容很稀缺,还不需要个性化推荐,个性化推荐只有到内容大爆炸时才有用武之地。
  今日头条终会切回直播频道
  相逢的人会再相逢。
  在移动资讯市场,今日头面对腾讯、网易等对手,以个性化推荐打了出来,然而腾讯推出天天快报并成功做到个性化内容平台的老二,QM 8月数据显示天天快报DAU为2112万。竞争日益激烈的当下,今日头条似乎无意与资讯客户端领域的对手们纠缠了,尤其是在直播领域。
  然而,鉴于直播是不可或缺却日益重要的内容形态,今日头条不论是从信息平台还是资讯平台的定位,都将回到这个赛场,况且短视频到一定阶段之后切入直播也是水到渠成的事情,就像美拍曾经走过的路一样。
  另一个角度来看,腾讯和网易在发力直播的同时,也在加强短视频,腾讯新闻和天天快报的主菜单之后,都是“视频”菜单,也是短视频为主,网易也同理。这些巨头级玩家眼下有资源,采取视频+直播的双线作战模式。(投黑马专注于文创领域的众筹平台)昔日曾与网易并列的门户搜狐,虽未发力直播,但却十分重视视频业务,且移动端短视频优先。在视频领域腾讯、网易与今日头条长期来说还有一场恶战要。
  可见,今日头条眼下不做直播,不代表接下来不做,但可以肯定的是无论今日头条参赛与否,资讯直播战争都将会愈演愈烈。
本文相关推荐 相关文章
声明:本网部分信息转载于其他网站,如稿件涉及版权等问题,侵犯了您的权益,请告知:,本站将第一时间处理!(发邮件请复制文章网址)AndroidStudio――今日头条(可以实时获取数据的app)
今日头条包含以下模块:
首页 视频 天气 和 我的
其中 首页用于加载实时的新闻频道及内容,可以实现点击图片查看图片详情,并且可以实现内容的收藏与取消收藏
视频模块暂时未加入任何内容
天气模块可以实现天气的实时更新,最多可以显示最近三天的天气情况
我的 模块中 点击收藏,可以查看收藏的新闻内容
**Activity代码:**
MainActivity
public class MainActivity extends AppCompatActivity {
private FragmentTabH
private String[] str = {&首页&, &视频&, &天气&, &我的&};
private int[] imgRes = {R.drawable.home, R.drawable.video, R.drawable.topic,
R.drawable.my};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ft = (FragmentTabHost) findViewById(R.id.ft);
getSupportActionBar().hide();
public void init() {
ft.setup(this, getSupportFragmentManager(), R.id.fl);
Fragment home = new HomeFragment();
//TabSpec标签说明
TabHost.TabSpec tabSpec0 =
ft.newTabSpec(str[0]).setIndicator(getView(0));
ft.addTab(tabSpec0, home.getClass(), null);
Fragment video = new VideoFragment();
TabHost.TabSpec tabSpec1 =
ft.newTabSpec(str[1]).setIndicator(getView(1));
ft.addTab(tabSpec1, video.getClass(), null);
Fragment topic = new TopicFragment();
TabHost.TabSpec tabSpec2 =
ft.newTabSpec(str[2]).setIndicator(getView(2));
ft.addTab(tabSpec2, topic.getClass(), null);
Fragment my = new MyFragment();
TabHost.TabSpec tabSpec3 =
ft.newTabSpec(str[3]).setIndicator(getView(3));
ft.addTab(tabSpec3, my.getClass(), null);
public View getView(int i) {
View v = getLayoutInflater().inflate(R.layout.tab_layout, null);
ImageView iv = (ImageView) v.findViewById(R.id.iv);
TextView tv = (TextView) v.findViewById(R.id.tv);
iv.setImageResource(imgRes[i]);
tv.setText(str[i]);
ContentActivity
public class ContentActivity extends AppCompatActivity {
private WebV
private ImageV
private TextView title,
private boolean isE
private NewsDao newsD
//全局变量自动赋值 局部变量不可以
private MyN
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_content);
getSupportActionBar().hide();
wv = (WebView) findViewById(R.id.wv);
back = (ImageView) findViewById(R.id.back);
title = (TextView) findViewById(R.id.title);
collection = (TextView) findViewById(R.id.collection);
//getIntent()是将该项目中包含的原始intent检索出来
//将检索出来的intent赋值给一个Intent类型的变量intent
Intent intent = getIntent();
String html = &&;
titles = &&;
if (intent != null) {
news = intent.getParcelableExtra(&news&);
html = news.getHtml();
titles = news.getTitle();
title.setText(titles);
WebSettings ws = wv.getSettings();
//支持放大
ws.setSupportZoom(true);
//显示放大缩小的控件
一个加号一个减号
ws.setDisplayZoomControls(true);
ws.setScriptEnabled(true);
ws.setDefaultTextEncodingName(&utf-8&);
//放大多少倍
//ws.setTextZoom(20);
wv.loadDataWithBaseURL(&&, html, &text/html&, &utf-8&, &&);
//设置内容的背景颜色
wv.setBackgroundColor(getResources().getColor(R.color.background));
newsDao = new NewsDao(this);
//判断新闻是否收藏过
checkNews(titles);
back.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
collection.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(isExisits){
newsDao.deleteNews(news.getTitle());
collection.setText(&取消收藏&);
newsDao.addNews(news);
collection.setText(&收藏&);
checkNews(news.getTitle());
public void checkNews(String title) {
MyNews myNews = newsDao.searchNews(title);
// MyNews myNews = new MyNews();
if (myNews == null) {
collection.setText(&收藏&);
isExisits =
collection.setText(&取消收藏&);
isExisits =
ImgActivity
public class ImgActivity extends AppCompatActivity {
private PhotoViewP
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_img);
getSupportActionBar().hide();
pvp = (PhotoViewPager) findViewById(R.id.pvp);
Intent intent = getIntent();
String imgUrls = intent.getStringExtra(&img&);
List pvList = new ArrayList&&();
List imgList = paserImageList(imgUrls);
for (int i = 0; i & imgList.size(); i++) {
PhotoView pv = new PhotoView(this);
pv.setScaleType(ImageView.ScaleType.CENTER_CROP);
Glide.with(this).load(imgList.get(i)).into(pv);
pvList.add(pv);
pvp.setAdapter(new MyViewPagerAdapter(pvList));
public List paserImageList(String imgList) {
List img = new ArrayList();
JSONArray ja = new JSONArray(imgList);
for (int i = 0; i & ja.length(); i++) {
JSONObject obj = (JSONObject) ja.get(i);
if (obj.has(&url&)) {
img.add(obj.getString(&url&));
} catch (JSONException e) {
e.printStackTrace();
public class MyViewPagerAdapter extends PagerAdapter {
private List myD
public MyViewPagerAdapter(List myData) {
this.myData = myD
public int getCount() {
return myData.size();
public boolean isViewFromObject(View view, Object object) {
return view ==
//自己写的
public Object instantiateItem(ViewGroup container, int position) {
container.addView(myData.get(position));
return myData.get(position);
//自己写的
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(myData.get(position));
CollectionActivity
public class CollectionActivity extends AppCompatActivity {
private ListV
private List
private NewsDao newsD
private NewsBaseA
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_collection);
lv = (ListView) findViewById(R.id.lv);
list = new ArrayList&&();
na = new NewsBaseAdapter(list, this);
lv.setAdapter(na);
newsDao = new NewsDao(this);
getList();
public void getList() {
list.clear();
//list=List不可用
由于不能触发na.notifyDataSetChanged();所以导致布局加载不出数据来
list.addAll(newsDao.searchNews());
na.notifyDataSetChanged();
protected void onStart() {
super.onStart();
getList();
**adapter 代码**
MyTabHostAdapter
public class MyTabHostAdapter extends FragmentPagerAdapter {
private List
public MyTabHostAdapter(FragmentManager fm, List list) {
super(fm);
this.list =
public Fragment getItem(int position) {
return list.get(position);
public int getCount() {
return list.size();
NewsBaseAdapter
public class NewsBaseAdapter extends BaseAdapter {
private List myN
//常量必须从0开始
并且不能跳着来不能0,2,4...
private final int TYPE0 = 0;
private final int TYPE1 = 1;
private final int TYPE2 = 2;
private final int TYPE3 = 3;
public NewsBaseAdapter(List myNews, Context context) {
this.myNews = myN
this.context =
public int getCount() {
return myNews.size();
public Object getItem(int position) {
return myNews.get(position);
public long getItemId(int position) {
public View getView(int position, View convertView, ViewGroup parent) {
final ViewH
int type = getItemViewType(position);
if (convertView == null) {
vh = new ViewHolder();
if (type == 3) {
convertView = LayoutInflater.from(context).inflate(R.layout.my_news_layout3, null);
vh.title = (TextView) convertView.findViewById(R.id.title);
vh.pubDate = (TextView) convertView.findViewById(R.id.pubDate);
vh.source = (TextView) convertView.findViewById(R.id.source);
vh.img = (ImageView) convertView.findViewById(R.id.img);
vh.img2 = (ImageView) convertView.findViewById(R.id.img2);
vh.img3 = (ImageView) convertView.findViewById(R.id.img3);
vh.img.setOnClickListener(new ClickLisner(position));
vh.img2.setOnClickListener(new ClickLisner(position));
vh.img3.setOnClickListener(new ClickLisner(position));
convertView.setTag(vh);
} else if (type == 2) {
convertView = LayoutInflater.from(context).inflate(R.layout.my_news_layout2, null);
vh.title = (TextView) convertView.findViewById(R.id.title);
vh.pubDate = (TextView) convertView.findViewById(R.id.pubDate);
vh.source = (TextView) convertView.findViewById(R.id.source);
vh.img = (ImageView) convertView.findViewById(R.id.img);
vh.img2 = (ImageView) convertView.findViewById(R.id.img2);
vh.img.setOnClickListener(new ClickLisner(position));
vh.img2.setOnClickListener(new ClickLisner(position));
convertView.setTag(vh);
} else if (type == 1) {
convertView = LayoutInflater.from(context).inflate(R.layout.my_news_layout1, null);
vh.title = (TextView) convertView.findViewById(R.id.title);
vh.pubDate = (TextView) convertView.findViewById(R.id.pubDate);
vh.source = (TextView) convertView.findViewById(R.id.source);
vh.img = (ImageView) convertView.findViewById(R.id.img);
vh.img.setOnClickListener(new ClickLisner(position));
convertView.setTag(vh);
convertView = LayoutInflater.from(context).inflate(R.layout.my_news_layout, null);
vh.title = (TextView) convertView.findViewById(R.id.title);
vh.pubDate = (TextView) convertView.findViewById(R.id.pubDate);
vh.source = (TextView) convertView.findViewById(R.id.source);
convertView.setTag(vh);
vh = (ViewHolder) convertView.getTag();
//通过这一句知道要加载哪个频道的news
MyNews news = myNews.get(position);
if (type == 3) {
vh.title.setText(news.getTitle());
vh.source.setText(news.getSource());
vh.pubDate.setText(news.getPubDate());
List list = paserImageList(news.getImageurls());
if (list.size() == 3) {
Glide.with(context).load(list.get(0)).into(vh.img);
Glide.with(context).load(list.get(1)).into(vh.img2);
Glide.with(context).load(list.get(2)).into(vh.img3);
} else if (type == 2) {
vh.title.setText(news.getTitle());
vh.source.setText(news.getSource());
vh.pubDate.setText(news.getPubDate());
List list = paserImageList(news.getImageurls());
if (list.size() == 2) {
Glide.with(context).load(list.get(0)).into(vh.img);
Glide.with(context).load(list.get(1)).into(vh.img2);
} else if (type == 1) {
vh.title.setText(news.getTitle());
vh.source.setText(news.getSource());
vh.pubDate.setText(news.getPubDate());
List list = paserImageList(news.getImageurls());
if (list.size() == 1) {
Glide.with(context).load(list.get(0)).into(vh.img);
vh.title.setText(news.getTitle());
vh.source.setText(news.getSource());
vh.pubDate.setText(news.getPubDate());
convertView.setOnClickListener(new ClickLisner(position));
return convertV
public class ClickLisner implements View.OnClickListener {
//在类里生成构造 把position传进来
public ClickLisner(int position) {
this.position =
public void onClick(View v) {
int id=v.getId();
if(id==R.id.img||id==R.id.img2||id==R.id.img3){
Intent intent=new Intent(context, ImgActivity.class);
intent.putExtra(&img&,myNews.get(position).getImageurls());
context.startActivity(intent);
MyNews news = myNews.get(position);
// Log.d(&======&, news.getHtml());
Intent intent = new Intent(context, ContentActivity.class);
//MyNews要实现序列化
intent.putExtra(&news&, news);
context.startActivity(intent);
public class ViewHolder {
TextView pubD
ImageView img2;
ImageView img3;
public int getItemViewType(int position) {
List list = paserImageList(myNews.get(position).getImageurls());
if (list.size() == 3) {
return TYPE3;
} else if (list.size() == 1) {
return TYPE1;
} else if (list.size() == 2) {
return TYPE2;
return TYPE0;
public int getViewTypeCount() {
public List paserImageList(String imgList) {
List img = new ArrayList();
JSONArray ja = new JSONArray(imgList);
for (int i = 0; i & imgList.length(); i++) {
JSONObject obj = (JSONObject) ja.get(i);
if (obj.has(&url&)) {
img.add(obj.getString(&url&));
} catch (JSONException e) {
e.printStackTrace();
NewsFragmentAdapter
public class NewsFragmentAdapter extends FragmentPagerAdapter {
private List fragmentL
private List
public NewsFragmentAdapter(FragmentManager fm, List fragmentList, List titles) {
//public NewsFragmentAdapter(List fm,FragmentActivity fragmentList) {
super(fm);
this.fragmentList = fragmentL
this.titles =
public Fragment getItem(int position) {
return fragmentList.get(position);
public int getCount() {
return fragmentList.size();
public CharSequence getPageTitle(int position) {
return titles.get(position);
**dao文件**
public class NewsDao {
private MyDbHelper myDbH
public NewsDao(Context context) {
myDbHelper = new MyDbHelper(context);
//收藏新闻
public void addNews(MyNews myNews) {
SQLiteDatabase db = myDbHelper.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(&title&, myNews.getTitle());
cv.put(&pubDate&, myNews.getPubDate());
cv.put(&source&, myNews.getSource());
cv.put(&html&, myNews.getHtml());
cv.put(&imageurls&, myNews.getImageurls());
db.insert(&news&, null, cv);
db.close();
//查询所有收藏
public List searchNews() {
SQLiteDatabase db = myDbHelper.getReadableDatabase();
Cursor cs = db.query(&news&, null, null, null, null, null, null);
MyNews myNews =
List list = new ArrayList&&();
while (cs.moveToNext()) {
myNews = new MyNews();
// cs.getColumnIndex(&_id&)
id 这一列结果中的下标
myNews.setTitle(cs.getString(cs.getColumnIndex(&title&)));
myNews.setSource(cs.getString(cs.getColumnIndex(&source&)));
myNews.setPubDate(cs.getString(cs.getColumnIndex(&pubDate&)));
myNews.setHtml(cs.getString(cs.getColumnIndex(&html&)));
myNews.setImageurls(cs.getString(cs.getColumnIndex(&imageurls&)));
list.add(myNews);
cs.close();
db.close();
//查询一条收藏
public MyNews searchNews(String title) {
SQLiteDatabase db = myDbHelper.getWritableDatabase();
Cursor cs = db.query(&news&, null, &title = ? &, new String[]{title}, null, null, null);
MyNews myNews =
if (cs.moveToNext()) {
myNews = new MyNews();
// cs.getColumnIndex(&_id&)
id 这一列结果中的下标
myNews.setTitle(cs.getString(cs.getColumnIndex(&title&)));
myNews.setSource(cs.getString(cs.getColumnIndex(&source&)));
myNews.setPubDate(cs.getString(cs.getColumnIndex(&pubDate&)));
myNews.setHtml(cs.getString(cs.getColumnIndex(&html&)));
myNews.setImageurls(cs.getString(cs.getColumnIndex(&imageurls&)));
cs.close();
db.close();
return myN
// 取消收藏
public void deleteNews(String title) {
SQLiteDatabase db = myDbHelper.getWritableDatabase();
db.delete(&news&, &title= ? &, new String[]{title});
db.close();
NewsCacheDao
public class NewsCacheDao {
private Dao newsD
private DatabaseH
public NewsCacheDao(Context context) {
this.context =
helper = (DatabaseHelper) DatabaseHelper.getHelper(context);
newsDao = helper.getDao(MyNews.class);
} catch (SQLException e) {
e.printStackTrace();
public void addNews(MyNews news) {
//根据主键来判断是更新还是修改
因此一定要有主键
newsDao.createOrUpdate(news);
} catch (SQLException e) {
e.printStackTrace();
//根据id查找新闻
public ArrayList searchNews(String chId) {
return (ArrayList) newsDao.queryBuilder().where().eq(&channelId&, chId).query();
} catch (SQLException e) {
e.printStackTrace();
WeatherCacheDao
public class WeatherCacheDao {
private Dao weatherD
private DatabaseH
public WeatherCacheDao(Context context) {
this.context =
helper = (DatabaseHelper) DatabaseHelper.getHelper(context);
weatherDao = helper.getDao(Weather.class);
} catch (SQLException e) {
e.printStackTrace();
public void addWeather(Weather weather) {
//根据主键来判断是更新还是修改
因此一定要有主键
weatherDao.createOrUpdate(weather);
} catch (SQLException e) {
e.printStackTrace();
//查询所有
public List searchWeather() {
return weatherDao.queryForAll();
} catch (SQLException e) {
e.printStackTrace();
void deleteAll(){
weatherDao.deleteBuilder().delete();
} catch (SQLException e) {
e.printStackTrace();
**dataBaseHelper文件**
DatabaseHelper
class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private static final String TABLE_NAME = &ormtest.db&;
private Map daos = new HashMap();
private static DatabaseH
private DatabaseHelper(Context context) {
super(context, TABLE_NAME, null, 2);
public void onCreate(SQLiteDatabase database,
ConnectionSource connectionSource) {
TableUtils.createTable(connectionSource, MyNews.class);
TableUtils.createTable(connectionSource, Weather.class);
} catch (SQLException e) {
e.printStackTrace();
public void onUpgrade(SQLiteDatabase database,
ConnectionSource connectionSource, int oldVersion, int newVersion) {
//匹配User.class类
TableUtils.dropTable(connectionSource, MyNews.class, true);
TableUtils.dropTable(connectionSource, Weather.class, true);
onCreate(database, connectionSource);
} catch (SQLException e) {
e.printStackTrace();
* 单例获取该Helper
* @param context
public static synchronized DatabaseHelper getHelper(Context context) {
context = context.getApplicationContext();
if (instance == null) {
synchronized (DatabaseHelper.class) {
if (instance == null)
instance = new DatabaseHelper(context);
public synchronized Dao getDao(Class clazz) throws SQLException {
String className = clazz.getSimpleName();
if (daos.containsKey(className)) {
dao = daos.get(className);
if (dao == null) {
dao = super.getDao(clazz);
daos.put(className, dao);
* 释放资源
public void close() {
super.close();
for (String key : daos.keySet()) {
Dao dao = daos.get(key);
MyDbHelper
public class MyDbHelper extends SQLiteOpenHelper {
private final String DBNAME = &MyNews.db&;
private final String TABLE_NAME = &news&;
//在SQLite里用作特殊标识的要加下划线(主键)
private final String INFO_COLUM_ID = &nid&;
private final String INFO_COLUM_TITLE = &title&;
private final String INFO_COLUM_HTML = &html&;
private final String INFO_COLUM_PUBDATE = &pubDate&;
private final String INFO_COLUM_SOURCE = &source&;
private final String INFO_COLUM_IMG = &imageurls&;
public MyDbHelper(Context context) {
//版本号不能为0
super(context, &MyNews.db&, null, 1);
public MyDbHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
public void onCreate(SQLiteDatabase db) {
//如果没有及数据表 就会在OnCreate里自动创建
StringBuilder sql = new StringBuilder();
sql.append(&Create table if not exists &);
sql.append(TABLE_NAME + & ( &);
// autoincrement 这一行自动增长
//sql.append(INFO_COLUM_ID + & varchar(50) primary key ,&);
sql.append(INFO_COLUM_TITLE + & varchar(100)
primary key ,&);
sql.append(INFO_COLUM_HTML + & varchar(5000),&);
sql.append(INFO_COLUM_PUBDATE + & varchar(20),&);
sql.append(INFO_COLUM_SOURCE + & varchar(20),&);
sql.append(INFO_COLUM_IMG + & varchar(500)&);
sql.append(& ) &);
db.execSQL(sql.toString());
//数据库更新升级
// 通过版本号Version 删除以前的表
然后重新调用OnCreate
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//删除表(delete是删除表里的数据)
String sql = & drop table if exists & + TABLE_NAME;
db.execSQL(sql);
onCreate(db);
**entity文件**
@DatabaseTable(tableName = &newsCache&)
public class MyNews implements Parcelable{
@DatabaseField
private String pubD
@DatabaseField(id=true)
private String channelN
@DatabaseField
@DatabaseField
private String channelId;
@DatabaseField
private List allL
@DatabaseField
public MyNews() {
protected MyNews(Parcel in) {
pubDate = in.readString();
title = in.readString();
channelName = in.readString();
desc = in.readString();
source = in.readString();
channelId = in.readString();
link = in.readString();
html = in.readString();
allList = in.createStringArrayList();
imageurls = in.readString();
nid = in.readString();
public static final Creator CREATOR = new Creator() {
public MyNews createFromParcel(Parcel in) {
return new MyNews(in);
public MyNews[] newArray(int size) {
return new MyNews[size];
public int describeContents() {
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(pubDate);
dest.writeString(title);
dest.writeString(channelName);
dest.writeString(desc);
dest.writeString(source);
dest.writeString(channelId);
dest.writeString(link);
dest.writeString(html);
dest.writeStringList(allList);
dest.writeString(imageurls);
dest.writeString(nid);
public String getPubDate() {
return pubD
public String getTitle() {
public String getChannelName() {
return channelN
public String getDesc() {
public String getSource() {
public String getChannelId() {
return channelId;
public String getLink() {
public String getHtml() {
public List getAllList() {
return allL
public String getImageurls() {
public String getNid() {
public static Creator getCREATOR() {
return CREATOR;
public void setPubDate(String pubDate) {
this.pubDate = pubD
public void setTitle(String title) {
this.title =
public void setChannelName(String channelName) {
this.channelName = channelN
public void setDesc(String desc) {
this.desc =
public void setSource(String source) {
this.source =
public void setChannelId(String channelId) {
this.channelId = channelId;
public void setLink(String link) {
this.link =
public void setHtml(String html) {
this.html =
public void setAllList(List allList) {
this.allList = allL
public void setImageurls(String imageurls) {
this.imageurls =
public void setNid(String nid) {
this.nid =
@DatabaseTable
public class Weather implements Parcelable{
@DatabaseField(id=true)
@DatabaseField
private String text_
//白天天气现象文字
@DatabaseField
private String code_
//白天天气现象代码
@DatabaseField
private String text_
//晚间天气现象文字
@DatabaseField
private String code_
//晚间天气现象代码
//当天最高温度
//当天最低温度
//降水概率,范围0~100,单位百分比
private String wind_
//风向文字
private String wind_direction_
//风向角度,范围0~360
private String wind_
//风速,单位km/h(当unit=c时)、mph(当unit=f时)
private String wind_
//风力等级
public Weather() {
protected Weather(Parcel in) {
date = in.readString();
text_day = in.readString();
code_day = in.readString();
text_night = in.readString();
code_night = in.readString();
high = in.readString();
low = in.readString();
precip = in.readString();
wind_direction = in.readString();
wind_direction_degree = in.readString();
wind_speed = in.readString();
wind_scale = in.readString();
public static final Creator CREATOR = new Creator() {
public Weather createFromParcel(Parcel in) {
return new Weather(in);
public Weather[] newArray(int size) {
return new Weather[size];
public String getDate() {
public String getText_day() {
return text_
public String getCode_day() {
return code_
public String getText_night() {
return text_
public String getCode_night() {
return code_
public String getHigh() {
public String getLow() {
public String getPrecip() {
public String getWind_direction() {
return wind_
public String getWind_direction_degree() {
return wind_direction_
public String getWind_speed() {
return wind_
public String getWind_scale() {
return wind_
public void setDate(String date) {
this.date =
public void setText_day(String text_day) {
this.text_day = text_
public void setCode_day(String code_day) {
this.code_day = code_
public void setText_night(String text_night) {
this.text_night = text_
public void setCode_night(String code_night) {
this.code_night = code_
public void setHigh(String high) {
this.high =
public void setLow(String low) {
this.low =
public void setPrecip(String precip) {
this.precip =
public void setWind_direction(String wind_direction) {
this.wind_direction = wind_
public void setWind_direction_degree(String wind_direction_degree) {
this.wind_direction_degree = wind_direction_
public void setWind_speed(String wind_speed) {
this.wind_speed = wind_
public void setWind_scale(String wind_scale) {
this.wind_scale = wind_
public int describeContents() {
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(date);
dest.writeString(text_day);
dest.writeString(code_day);
dest.writeString(text_night);
dest.writeString(code_night);
dest.writeString(high);
dest.writeString(low);
dest.writeString(precip);
dest.writeString(wind_direction);
dest.writeString(wind_direction_degree);
dest.writeString(wind_speed);
dest.writeString(wind_scale);
public String toString() {
return &Weather{& +
&date='& + date + '\'' +
&, text_day='& + text_day + '\'' +
&, code_day='& + code_day + '\'' +
&, text_night='& + text_night + '\'' +
&, code_night='& + code_night + '\'' +
&, high='& + high + '\'' +
&, low='& + low + '\'' +
&, precip='& + precip + '\'' +
&, wind_direction='& + wind_direction + '\'' +
&, wind_direction_degree='& + wind_direction_degree + '\'' +
&, wind_speed='& + wind_speed + '\'' +
&, wind_scale='& + wind_scale + '\'' +
'}';
**fragment文件**
HomeFragment
public class HomeFragment extends Fragment {
private PagerSlidingTabS
private ViewP
private List fragmentL
private List<map& channelL
private List
private NewsFragmentA
public HomeFragment() {
// Required empty public constructor
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.home_layout, container, false);
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
fragmentList = new ArrayList&&();
titles = new ArrayList&&();
pst = (PagerSlidingTabStrip) getView().findViewById(R.id.pst);
vp = (ViewPager) getView().findViewById(R.id.vp);
nfa = new NewsFragmentAdapter(getChildFragmentManager(), fragmentList, titles);
vp.setAdapter(nfa);
vp.setOffscreenPageLimit(2);
pst.setViewPager(vp);
pst.setIndicatorHeight(0);
pst.setUnderlineHeight(0);
pst.setShouldExpand(true);
//读取文件
String fileName = &channel.txt&;
//获得文件所在的包名
String pn = getActivity().getPackageName();
//如果存在频道文件则读取
否则 从网络获取
if (FileUitlity.fileExists(pn + &/& + fileName)) {
String ja = FileUitlity.readFileFromSdcard(pn + &/& + fileName);
Log.d(&=====&, &读取文件成功&);
Log.d(&====1=&, ja);
initFragment(new JSONArray(ja));
} catch (JSONException e) {
e.printStackTrace();
new GetChannel().execute(UrlUtil.channelUrl);
//获取频道的异步任务类
public class GetChannel extends AsyncTask {
protected String doInBackground(String... strings) {
return HttpUtil.HttpGet(strings[0]);
protected void onPostExecute(String s) {
super.onPostExecute(s);
//解析频道json数据
JSONObject jsonObject = new JSONObject(s);
JSONObject body = jsonObject.getJSONObject(&showapi_res_body&);
JSONArray ja = body.getJSONArray(&channelList&);
if (ja.length() & 0) {
String pn = getActivity().getPackageName();
FileUitlity.getInstance(getActivity(), pn);
String result = FileUitlity.saveFileToSdcard(pn + &/channel.txt&,
ja.toString());
if (result.equals(&ok&)) {
Log.d(&=====&, &文件保存成功&);
Log.d(&=====&, &文件保存失败&);
initFragment(ja);
} catch (JSONException e) {
e.printStackTrace();
//初始化fragment
public void initFragment(JSONArray ja) throws JSONException {
//解析完频道数据后
放入channelList中
channelList = new ArrayList&&();
for (int i = 0; i & ja.length(); i++) {
JSONObject obj = (JSONObject) ja.get(i);
String id = obj.getString(&channelId&);
String name = obj.getString(&name&);
HashMap map = new HashMap();
map.put(&id&, id);
map.put(&name&, name);
channelList.add(map);
titles.add(name);
//根据频道数新建fragment
for (int i = 0; i & channelList.size(); i++) {
Fragment fragment = new NewsFragment();
Bundle bundle = new Bundle();
//获取频道的id和name
并把他们传到NewsFragment中去
bundle.putString(&id&, channelList.get(i).get(&id&));
bundle.putString(&name&, channelList.get(i).get(&name&));
//把频道的id和name放入相应的fragment中去
fragment.setArguments(bundle);
fragmentList.add(fragment);
pst.notifyDataSetChanged();
nfa.notifyDataSetChanged();
NewsFragment
public class NewsFragment extends Fragment {
private PullToRefreshListV
private NewsBaseA
private List newsL
private NewsCacheDao newsCacheD
private TextV
private int page = 1;
private String id,
//Handler要用OS包里的
Handler的声明方式不同 大括号后面要加分号
private Handler handler = new Handler() {
//handleMessag在主线程中运行
相当于异步任务类里的OnPostExcute()
public void handleMessage(Message msg) {
super.handleMessage(msg);
//判断属于哪个线程进行实现
if (msg.what == 1) {
Bundle bundle = msg.getData();
List list = bundle.getParcelableArrayList(&cache&);
newsList.addAll(list);
nba.notifyDataSetChanged();
//tv.setText(&读取缓存成功&);
new GetNews().execute(url);
public NewsFragment() {
// Required empty public constructor
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_news, container, false);
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
newsCacheDao = new NewsCacheDao(getActivity());
newsList = new ArrayList&&();
tv = (TextView) getView().findViewById(R.id.tv);
prlv = (PullToRefreshListView) getView().findViewById(R.id.prlv);
nba = new NewsBaseAdapter(newsList,getActivity());
prlv.setAdapter(nba);
//设置上下都可以刷新
prlv.setMode(PullToRefreshBase.Mode.BOTH);
//注册监听
prlv.setOnRefreshListener(new prlvLisen());
Bundle bundle = getArguments();
//接收HomeFragment中传过来的数据
这样才能知道现在处于哪个频道下
然后根据频道的id和name加载不同的数据
id = bundle.getString(&id&);
name = bundle.getString(&name&);
url = UrlUtil.newsUrl + &?channelId=& + id
+ &&channelName=& + name + &&needHtml=1&;
//执行线程要用run
//new GetCache(id).run();
new Thread(new GetCache()).start();
//getCache(id);
//new GetNews().execute(url);(这一句转去 getCache里写)
//读取数据库缓存 线程
public class GetCache implements Runnable {
//run()在子线程中运行
public void run() {
Bundle bundle = new Bundle();
ArrayList list = newsCacheDao.searchNews(id);
bundle.putParcelableArrayList(&cache&, list);
//tv.setText(&读取缓存成功&);
//nba.notifyDataSetChanged();
//new GetNews().execute(url);
Message message = new Message();
//如果有需要的话先把数据放入bundle里
再放入message里
//message.setData();
message.setData(bundle);
message.what = 1;
//告诉它子线程已经执行完了
要返回子线程中去handler.sendMessage()
handler.sendMessage(message);
//加载网络数据 异步任务类
public class GetNews extends AsyncTask {
protected String doInBackground(String... strings) {
return HttpUtil.HttpGet(strings[0]);
protected void onPostExecute(String s) {
super.onPostExecute(s);
//解析 新闻数据
JSONObject obj = new JSONObject(s);
JSONObject body = obj.getJSONObject(&showapi_res_body&);
JSONObject pageBean = body.getJSONObject(&pagebean&);
JSONArray contentList = pageBean.getJSONArray(&contentlist&);
if (page == 1) {
newsList.clear();
//在获取网络的时候清空list(防止重复) 不是清空数据库
for (int i = 0; i & contentList.length(); i++) {
JSONObject jo = (JSONObject) contentList.get(i);
//MyNews要有一个空的构造
不然这句话报错
MyNews myNews = new MyNews();
myNews.setTitle(jo.getString(&title&));
myNews.setPubDate(jo.getString(&pubDate&));
myNews.setImageurls(jo.getString(&imageurls&));
myNews.setSource(jo.getString(&source&));
myNews.setHtml(jo.getString(&html&));
myNews.setChannelId(jo.getString(&channelId&));
newsCacheDao.addNews(myNews);
newsList.add(myNews);
nba.notifyDataSetChanged();
prlv.onRefreshComplete();
} catch (JSONException e) {
e.printStackTrace();
public void getCache(String id) {
//读本地缓存
newsList.addAll(newsCacheDao.searchNews(id));
nba.notifyDataSetChanged();
//如果没有加载网络
if (newsList.size() == 0) {
new GetNews().execute(url);
//下拉上拉 监听 内部类
public class prlvLisen implements PullToRefreshBase.OnRefreshListener2 {
public void onPullDownToRefresh(PullToRefreshBase refreshView) {
url = UrlUtil.newsUrl + &?channelId=& + id
+ &&channelName=& + name + &&page=& + page + &&needHtml=1&;
new GetNews().execute(url);
public void onPullUpToRefresh(PullToRefreshBase refreshView) {
url = UrlUtil.newsUrl + &?channelId=& + id
+ &&channelName=& + name + &&page=& + page + &&needHtml=1&;
new GetNews().execute(url);
MyFragment
public class MyFragment extends Fragment {
private KenBurnsV
private ImageV
public MyFragment() {
// Required empty public constructor
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.my_layout, container, false);
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
img= (KenBurnsView) getView().findViewById(R.id.img);
collection= (ImageView) getView().findViewById(R.id.collection);
collection.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent=new Intent(getActivity(), CollectionActivity.class);
startActivity(intent);
TopicFragment(里面为天气)
public class TopicFragment extends Fragment {
private RequestQ
private SwipeRefreshL
private CardView card1, card2, card3;
private WeatherCacheDao weatherCacheD
public TopicFragment() {
// Required empty public constructor
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.weather_layout, container, false);
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
card1 = (CardView) getView().findViewById(R.id.card1);
card2 = (CardView) getView().findViewById(R.id.card2);
card3 = (CardView) getView().findViewById(R.id.card3);
weatherCacheDao = new WeatherCacheDao(getActivity());
queue = Volley.newRequestQueue(getActivity());
swip = (SwipeRefreshLayout) getView().findViewById(R.id.swip);
//进度条背景色
swip.setProgressBackgroundColorSchemeColor(getResources().getColor(R.color.colorPrimary));
swip.setColorSchemeResources(R.color.colorAccent);
swip.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
//下拉刷新时执行此方法
可以写加载网络。。。等命令
public void onRefresh() {
//收起刷新进度条
//swip.setRefreshing(false);
//new Thread(new GetCache()).start();
getWeather();
readDatabase();
public void readDatabase() {
List list = weatherCacheDao.searchWeather();
//去生成Weather的toString方法
paraseList(list);
//获取天气
public void getWeather() {
String url = UrlUtil.weatherUrl + &?location=yantai&;
StringGetRequest sgr = new StringGetRequest(Request.Method.GET, url, new
Response.Listener() {
public void onResponse(String s) {
if (!s.equals(&&)) {
JSONObject obj = new JSONObject(s);
JSONArray results = obj.getJSONArray(&results&);
JSONArray ja1 = ((JSONObject) (results.get(0))).getJSONArray(&daily&);
Gson gson = new Gson();
List list = gson.fromJson(ja1.toString(), new TypeToken<list&() {
}.getType());
//只要一刷新就把缓存的清空掉
weatherCacheDao.deleteAll();
paraseList(list);
for (int i = 0; i & results.length(); i++) {
JSONObject jo = results.getJSONObject(i);
Weather weather = new Weather();
weather.setDate(jo.getString(&date&));
weather.setText_day(jo.getString(&text_day&));
weather.setCode_day(jo.getString(&code_day&));
weather.setText_night(jo.getString(&text_night&));
weather.setCode_night(jo.getString(&code_nigh&));
weather.setHigh(jo.getString(&high&));
weather.setLow(jo.getString(&low&));
weather.setPrecip(jo.getString(&precip&));
weather.setWind_direction(jo.getString(&wind_direction&));
weather.setWind_direction_degree(jo.getString(&wind_direction_degree&));
weather.setWind_speed(jo.getString(&wind_speed&));
weather.setWind_scale(jo.getString(&wind_scale&));
weatherList.add(weather);
} catch (JSONException e) {
e.printStackTrace();
swip.setRefreshing(false);
}, new Response.ErrorListener() {
public void onErrorResponse(VolleyError volleyError) {
swip.setRefreshing(false);
sgr.putHeaders(&apikey&, &3f37b44e4d7c4bf6c0f5&);
queue.add(sgr);
//解析weather
public void paraseList(List list) {
for (int i = 0; i & list.size(); i++) {
View view = LayoutInflater.from(getActivity()).inflate(R.layout.weather_content, null);
Weather day = list.get(i);
weatherCacheDao.addWeather(day);
TextView date = (TextView) view.findViewById(R.id.date);
TextView text_day = (TextView) view.findViewById(R.id.text_day);
TextView code_day = (TextView) view.findViewById(R.id.code_day);
TextView text_night = (TextView) view.findViewById(R.id.text_night);
TextView code_night = (TextView) view.findViewById(R.id.code_night);
TextView high = (TextView) view.findViewById(R.id.high);
TextView low = (TextView) view.findViewById(R.id.low);
TextView precip = (TextView) view.findViewById(R.id.precip);
TextView wind_direction = (TextView) view.findViewById(R.id.wind_direction);
TextView wind_direction_degree = (TextView) view.findViewById(R.id.wind_direction_degree);
TextView wind_speed = (TextView) view.findViewById(R.id.wind_speed);
TextView wind_scale = (TextView) view.findViewById(R.id.wind_scale);
date.setText(day.getDate());
text_day.setText(day.getText_day());
code_day.setText(day.getCode_day());
text_night.setText(day.getText_night());
code_night.setText(day.getCode_night());
high.setText(day.getHigh());
low.setText(day.getLow());
precip.setText(day.getPrecip());
wind_direction.setText(day.getWind_direction());
wind_direction_degree.setText(day.getWind_direction_degree());
wind_scale.setText(day.getWind_scale());
wind_speed.setText(day.getWind_speed());
if (i == 0) {
if (card1.getChildCount() & 0) {
card1.removeAllViews();
card1.addView(view);
if (i == 1) {
if (card2.getChildCount() & 0) {
card2.removeAllViews();
card2.addView(view);
if (i == 2) {
if (card3.getChildCount() & 0) {
card3.removeAllViews();
card3.addView(view);
**util工具类**
public class HttpUtil {
public static String HttpGet(String uri){
HttpURLConnection con =
BufferedReader reader =
InputStream is =
StringBuilder sbd = new StringBuilder();
URL url = new URL(uri);
con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(5*1000);
con.setReadTimeout(5*1000);
con.setRequestProperty(&apikey&,&5bb1ff1b470acd&);
con.connect();
if(con.getResponseCode()==200){
is = con.getInputStream();
reader = new BufferedReader(new InputStreamReader(is));
String strRead =
while ((strRead = reader.readLine()) != null) {
sbd.append(strRead);
sbd.append(&\r\n&);
return sbd.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(reader!=null){
reader.close();
} catch (IOException e) {
e.printStackTrace();
return &&;
public class FileUitlity {
private static String ROOT_CACHE;
private static FileUitlity instance =
private FileUitlity() {
//创建文件夹
public static FileUitlity getInstance(Context context, String root_dir) {
if (instance == null) {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
ROOT_CACHE = (Environment.getExternalStorageDirectory() + &/&
+ root_dir + &/&);
ROOT_CACHE = (context.getFilesDir().getAbsolutePath() + &/& + root_dir + &/&);
File dir = new File(ROOT_CACHE);
if (!dir.exists()) {
dir.mkdirs();
instance = new FileUitlity();
public File makeDir(String dir) {
File fileDir = new File(ROOT_CACHE + dir);
if (fileDir.exists()) {
return fileD
fileDir.mkdirs();
return fileD
//判断文件是否存在SD卡
public static boolean fileExists(String fileName) {
String state = Environment.getExternalStorageState();
if (!state.equals(Environment.MEDIA_MOUNTED)) {
File root = Environment.getExternalStorageDirectory();
File file = new File(root, fileName);
return file.exists();
//保存文件到SD卡
public static String saveFileToSdcard(String fileName, String content) {
String state = Environment.getExternalStorageState();
if (!state.equals(Environment.MEDIA_MOUNTED)) {
return &SD卡未就绪&;
File root = Environment.getExternalStorageDirectory();
FileOutputStream fos =
fos = new FileOutputStream(root + &/& + fileName);
fos.write(content.getBytes());
return &ok&;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
fos.close();
} catch (IOException e) {
e.printStackTrace();
return &&;
//读取SD卡文件
public static String readFileFromSdcard(String fileName) {
String statue = Environment.getExternalStorageState();
if (!statue.equals(Environment.MEDIA_MOUNTED)) {
return &&;
File root = Environment.getExternalStorageDirectory();
BufferedReader reader =
FileInputStream fis =
StringBuilder sbd = new StringBuilder();
fis = new FileInputStream(root + &/& + fileName);
reader = new BufferedReader(new InputStreamReader(fis));
String row = &&;
while ((row = reader.readLine()) != null) {
sbd.append(row);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
reader.close();
} catch (IOException e) {
e.printStackTrace();
return sbd.toString();
public class StringGetRequest extends StringRequest {
private Map
public StringGetRequest(int method, String url, Response.Listener listener, Response.ErrorListener errorListener) {
super(method, url, listener, errorListener);
header = new HashMap&&();
public void putHeaders(String key, String value) {
header.put(key, value);
public Map getHeaders() throws AuthFailureError {
public class StringPostRequest extends StringRequest {
private Map
private Map
public StringPostRequest(String url, Listener listener,
ErrorListener errorListener) {
//super实际调用了StringRequest的四参构造
super(Method.POST, url, listener, errorListener);
params = new HashMap();
header = new HashMap();
//回调方法
用的时候往Map里放值就可以
protected Map getParams() throws AuthFailureError {
public void putParams(String key, String value) {
this.params.put(key, value);
public Map getHeaders() throws AuthFailureError {
public void putHeaders(String key, String value) {
this.header.put(key, value);
public class UrlUtil {
//获取频道的网络接口
public static String channelUrl = &/showapi_open_bus/channel_news/channel_news&;
/获取频道对应新闻的网络接口
get请求参数:
:新闻频道id,必须精确匹配
channelName :新闻频道名称,可模糊匹配
:新闻标题,模糊匹配
:页数,默认1。每页最多20条记
needContent:是否需要返回正文,1为需要
needHtml:是否需要返回正文的html格式,1为需要
//获取新闻的网络接口
public static String newsUrl = &/showapi_open_bus/channel_news/search_news&;
参数名 类型
所查询的位置
//获取天气的网络接口
public static String weatherUrl = &/thinkpage/weather_api/suggestion&;
public class PhotoViewPager extends ViewPager
private float mT
private float mS
* 最大的缩小比例
private static final float SCALE_MAX = 0.0f;
* 保存position与对于的View
private HashMap mChildrenViews = new LinkedHashMap();
* 滑动时左边的元素
private View mL
* 滑动时右边的元素
private View mR
public PhotoViewPager(Context context, AttributeSet attrs)
super(context, attrs);
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels)
Log.e(TAG, &position=& + position+&, positionOffset = &+positionOffset+& ,positionOffsetPixels =
& + positionOffsetPixels+& , currentPos = & + getCurrentItem());
//滑动特别小的距离时,我们认为没有动,可有可无的判断
float effectOffset = isSmall(positionOffset) ? 0 : positionO
//获取左边的View
mLeft = findViewFromObject(position);
//获取右边的View
mRight = findViewFromObject(position + 1);
// 添加切换动画效果
animateStack(mLeft, mRight, effectOffset, positionOffsetPixels);
super.onPageScrolled(position, positionOffset, positionOffsetPixels);
public void setObjectForPosition(View view, int position)
mChildrenViews.put(position, view);
* 通过过位置获得对应的View
* @param position
public View findViewFromObject(int position)
return mChildrenViews.get(position);
private boolean isSmall(float positionOffset)
return Math.abs(positionOffset) & 0.0001;
protected void animateStack(View left, View right, float effectOffset,
int positionOffsetPixels)
if (right != null)
* 缩小比例 如果手指从右到左的滑动(切换到后一个):0.0~1.0,即从一半到最大
* 如果手指从左到右的滑动(切换到前一个):1.0~0,即从最大到一半
mScale = (1 - SCALE_MAX) * effectOffset + SCALE_MAX;
* x偏移量: 如果手指从右到左的滑动(切换到后一个):0-720 如果手指从左到右的滑动(切换到前一个):720-0
mTrans = -getWidth() - getPageMargin() + positionOffsetP
right.setScaleX(mScale);
right.setScaleY(mScale);
right.setTranslationX(mTrans);
if (left != null)
left.bringToFront();
public boolean onTouchEvent(MotionEvent ev) {
return super.onTouchEvent(ev);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
**布局文件**
&framelayout android:id="@+id/fl" android:layout_height="0dp" android:layout_weight="1" android:layout_width="match_parent"&
&/framelayout&
&framelayout android:layout_height="match_parent" android:layout_width="match_parent" xmlns:android="/apk/res/android" xmlns:app="/apk/res-auto"&
&/framelayout&
运行效果展示:
显示收藏的新闻:
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

我要回帖

更多关于 今日国际新闻头条 的文章

 

随机推荐