package com.roboo.like.google.async;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OptionalDataException;
import java.io.StreamCorruptedException;
import java.util.LinkedList;
import android.content.Context;
import com.roboo.like.google.GoogleApplication;
import com.roboo.like.google.models.NewsItem;
import com.roboo.like.google.news.utils.NewsListUtils;
import com.roboo.like.google.utils.FileUtils;
import com.roboo.like.google.utils.MD5Utils;
public class NewsListAsyncTaskLoader extends BaseAsyncTaskLoader<LinkedList<NewsItem>>
{
private String mChannelUrl;
private int mPageNo;
private Context mContext;
private LinkedList<NewsItem> mData ;
public NewsListAsyncTaskLoader(Context context, String channelUrl)
{
this(context, channelUrl, 1);
}
public NewsListAsyncTaskLoader(Context context, String channelUrl, int pageNo)
{
super(context);
mChannelUrl = channelUrl;
mContext = context;
mPageNo = pageNo;
}
@Override
public LinkedList<NewsItem> loadInBackground()
{
LinkedList<NewsItem> data = null;
try
{
File file = new File(FileUtils.getFileCacheDir(mContext, FileUtils.TYPE_NEWS_LIST), MD5Utils.generate(mChannelUrl));
data = NewsListUtils.getNewsList(mChannelUrl, mPageNo);
if (null != data)
{
if (mPageNo == 1)
{
saveNewsListData(data);
}
else
{
appendNewsListData(data);
}
}
if (data == null && file.exists())
{
data = getOfflineData(file);
}
mEndTime = System.currentTimeMillis();
long durationTime = mEndTime - mStartTime;
if (durationTime < THREAD_LEAST_DURATION_TIME)
{
Thread.sleep(THREAD_LEAST_DURATION_TIME - durationTime);
}
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}
return data;
}
/** 从文件中获取本地的离线数据 */
@SuppressWarnings("unchecked")
private LinkedList<NewsItem> getOfflineData(File file) throws StreamCorruptedException, IOException, FileNotFoundException, OptionalDataException, ClassNotFoundException
{
LinkedList<NewsItem> data;
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));
data = (LinkedList<NewsItem>) objectInputStream.readObject();
objectInputStream.close();
GoogleApplication.TEST = true;
if (GoogleApplication.TEST)
{
System.out.println("从本地文件读取对象成功");
}
return data;
}
/** 保存第一页数据到本地文件中 */
private void saveNewsListData(LinkedList<NewsItem> data)
{
File dirFile = FileUtils.getFileCacheDir(mContext, FileUtils.TYPE_NEWS_LIST);
File dataFile = new File(dirFile, MD5Utils.generate(mChannelUrl));
try
{
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(dataFile));
objectOutputStream.writeObject(data);
objectOutputStream.close();
GoogleApplication.TEST = true;
if (GoogleApplication.TEST)
{
System.out.println("新闻列表对象写入文件成功 :: 文件路径 = " + dataFile.getAbsolutePath());
}
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
/**
* 将第一页以后的数据追加到本地文件中去
*
* @throws ClassNotFoundException
* @throws IOException
* @throws FileNotFoundException
* @throws OptionalDataException
* @throws StreamCorruptedException
*/
private void appendNewsListData(LinkedList<NewsItem> data) throws StreamCorruptedException, OptionalDataException, FileNotFoundException, IOException, ClassNotFoundException
{
File dirFile = FileUtils.getFileCacheDir(mContext, FileUtils.TYPE_NEWS_LIST);
File dataFile = new File(dirFile, MD5Utils.generate(mChannelUrl));
LinkedList<NewsItem> offlineData = getOfflineData(dataFile);
LinkedList<NewsItem> needAppendData = new LinkedList<NewsItem>();
if (null != offlineData && data != null)
{
for (NewsItem item : data)
{
if (!offlineData.contains(item))
{
needAppendData.add(item);
}
}
if (needAppendData.size() > 0)
{
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(dataFile, true));
objectOutputStream.writeObject(data);
objectOutputStream.close();
GoogleApplication.TEST = true;
if (GoogleApplication.TEST)
{
System.out.println("追加新闻列表对象写入文件成功 :: 追加新闻个数 = " + needAppendData.size());
}
}
}
}
}