diff --git a/zhuike/src/main/AndroidManifest.xml b/zhuike/src/main/AndroidManifest.xml index 14c8e3d..520db16 100644 --- a/zhuike/src/main/AndroidManifest.xml +++ b/zhuike/src/main/AndroidManifest.xml @@ -15,33 +15,16 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/ToolBarTheme" + android:launchMode="singleInstance" android:usesCleartextTraffic="true"> - - - + - + - - + @@ -88,9 +65,6 @@ - 0) { mNovel = LitePal.find(Novel.class, mNovel.getId()); //更新最新进度 - if(pageFactory==null){ + if(pageFactory==null){ pageFactory = PageFactory.getInstance(getApplicationContext()); } - if(( pageFactory.getNovle()==null || mNovel.getId() !=pageFactory.getNovle().getId())){ + if( pageFactory.isWorking() && ( pageFactory.getNovle()==null || mNovel.getId() !=pageFactory.getNovle().getId())){ pageFactory.prepareBook(mNovel); } } diff --git a/zhuike/src/main/java/com/novelbook/android/Fragments/BasicFragment.java b/zhuike/src/main/java/com/novelbook/android/Fragments/BasicFragment.java index db6f7f0..800cc53 100644 --- a/zhuike/src/main/java/com/novelbook/android/Fragments/BasicFragment.java +++ b/zhuike/src/main/java/com/novelbook/android/Fragments/BasicFragment.java @@ -139,7 +139,7 @@ public abstract class BasicFragment extends Fragment { @Override public void handleMessage(Message msg) { - + hideProgress(); int wt = msg.what; if (msg.what == 1) { @@ -159,7 +159,7 @@ public abstract class BasicFragment extends Fragment { Toast.makeText(getActivity(),"好像没有网络啦",Toast.LENGTH_LONG).show(); } - hideProgress(); + } }; @@ -385,7 +385,7 @@ public abstract class BasicFragment extends Fragment { public void reload() { - initViews(); + loadData(); } public void loadData() { initData(); diff --git a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_Shelf.java b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_Shelf.java index 266c670..220b9dd 100644 --- a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_Shelf.java +++ b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_Shelf.java @@ -174,6 +174,7 @@ public class Fragment_Shelf extends BasicFragment { } }); + mAdapter.setNorecord(R.string.noRecordInshelf); ((Main2Activity) activity).setShelfFragment(this); } @Override diff --git a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_bookStore.java b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_bookStore.java index 165e1eb..562a0ff 100644 --- a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_bookStore.java +++ b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_bookStore.java @@ -3,6 +3,7 @@ package com.novelbook.android.Fragments; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentPagerAdapter; +import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.ViewPager; import android.util.Log; import android.view.View; @@ -25,8 +26,8 @@ public class Fragment_bookStore extends BasicFragment { ViewPager mViewpager; @BindView(R.id.tab_layout) SlidingTabLayout tabLayout; - - private ArrayList mFragments; + private FragmentStatePagerAdapter mAdapter =null; + private ArrayList mFragments; ArrayList mList; String[] mTitle; @@ -69,8 +70,16 @@ public class Fragment_bookStore extends BasicFragment { @Override public void initData() { + mTitle = new String[]{"精选", "榜单","分类"}; + if(mAdapter!=null) { + for(BasicFragment bf:mFragments){ + bf.initData(); + } + // mViewpager.setCurrentItem(0); + mAdapter.notifyDataSetChanged(); + } } @Override public void initViews(){ @@ -83,17 +92,17 @@ public class Fragment_bookStore extends BasicFragment { if(mFragments ==null || mFragments.size() ==0){ // mTitle = new String[]{"精选", "榜单", "书单"}; - mTitle = new String[]{"精选", "榜单","分类"}; mFragments = new ArrayList<>(); mFragments.add(new Fragment_jingxuan()); mFragments.add(new Fragment_bangdan()); mFragments.add(FragmentCates.newInstance()); + // mFragments.add(new Fragment_shudan()); Log.d(TAG,"initial fragments in tabs "); } Log.d(TAG,"set viewPager adapter "); // FragmentPagerAdapter mAdapter = new FragmentPagerAdapter(activity.getSupportFragmentManager()) { 第一次进入没问题,再次进入ViewPager的fragment时里面内容就没了,数据丢失 https://blog.csdn.net/allan_bst/article/details/64920076 - FragmentPagerAdapter mAdapter = new FragmentPagerAdapter(getChildFragmentManager()) { + mAdapter = new FragmentStatePagerAdapter(getChildFragmentManager()) { @Override public Fragment getItem(int position) { return mFragments.get(position); @@ -112,11 +121,15 @@ public class Fragment_bookStore extends BasicFragment { mViewpager.setOffscreenPageLimit(4);//预加载设置 mViewpager.setAdapter(mAdapter); tabLayout.setViewPager(mViewpager); + + // tabLayout.setViewPager(mViewpager, mTitle, activity, mFragments); - mViewpager.setCurrentItem(0); + // mViewpager.setCurrentItem(0); } + + @Override public void setFTag() { TAG="com.novelbook.android.Fragment_Store"; diff --git a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_booklist.java b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_booklist.java index 7168d2d..6bde796 100644 --- a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_booklist.java +++ b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_booklist.java @@ -42,6 +42,7 @@ import butterknife.BindView; public class Fragment_booklist extends BasicFragment { + public static String TAG = Fragment_booklist.class.getSimpleName(); private static final String EXTR_CATE ="cate" ; private static final String EXTR_PROGRESS ="progress" ; private static final String EXTR_SEARCH ="search"; @@ -266,6 +267,9 @@ public class Fragment_booklist extends BasicFragment { } @Override public void initViews(){ + //mRecyclerView + + //lv_catalogue.setFastScrollStyle(R.style.FastScrollTheme); //不起作用 initLoadMoreListener(); } diff --git a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_paihang.java b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_paihang.java index b34f057..1f92e56 100644 --- a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_paihang.java +++ b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_paihang.java @@ -133,7 +133,6 @@ final String TAG = Fragment_paihang.class.getSimpleName(); @Override public void initData() { - tmp=0; loadSearchData(); } private void loadSearchData(){ @@ -212,7 +211,7 @@ final String TAG = Fragment_paihang.class.getSimpleName(); handler.sendEmptyMessage(1); } }; - showProgressDialog(false,"正在加载..."); + showProgressDialog(false, "正在加载..."); BookSubscribe.getCateNovelList(cate, pageNo, tab1Pos+1, tab3Pos+1, new OnSuccessAndFaultSub(successAndFaultListener, getActivity())); @@ -330,9 +329,10 @@ final String TAG = Fragment_paihang.class.getSimpleName(); Toast.makeText(activity, selectedKey, Toast.LENGTH_SHORT).show(); tvHint.setText(selectedKey); - Log.d(TAG, String.format("tabChanged: to load data %s,pageno %s" , selectedKey,pageNo )); + Log.d(TAG, String.format("tabChanged: to load data %s,pageno %s, tmp %s" , selectedKey,pageNo ,tmp)); if( tmp<4) return; + loadSearchData(); diff --git a/zhuike/src/main/java/com/novelbook/android/ReadActivity.java b/zhuike/src/main/java/com/novelbook/android/ReadActivity.java index 867bc45..12cfbb6 100644 --- a/zhuike/src/main/java/com/novelbook/android/ReadActivity.java +++ b/zhuike/src/main/java/com/novelbook/android/ReadActivity.java @@ -427,6 +427,12 @@ public class ReadActivity extends Activity_base implements SpeechSynthesizerLis public void cancel() { pageFactory.cancelPage(); } + + @Override + public Boolean canCancel() { + // Log.d(TAG, "canCancel: cancelPage canCancel ?" + pageFactory.canCancelPage()); + return true;//pageFactory.canCancelPage(); + } }); } diff --git a/zhuike/src/main/java/com/novelbook/android/adapter/BookListAdapter.java b/zhuike/src/main/java/com/novelbook/android/adapter/BookListAdapter.java index 12eb1a6..6ef5fa3 100644 --- a/zhuike/src/main/java/com/novelbook/android/adapter/BookListAdapter.java +++ b/zhuike/src/main/java/com/novelbook/android/adapter/BookListAdapter.java @@ -54,6 +54,11 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol private boolean showFootView =false; private float percent =0; + private int norecord =R.string.noRecord; + + public void setNorecord(int norecord) { + this.norecord = norecord; + } public void setPercent(float percent) { this.percent = percent; @@ -183,7 +188,7 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol }else if (hd instanceof EmptyViewHolder) { EmptyViewHolder holder = (EmptyViewHolder)hd; holder.tvEmpty.setVisibility(View.VISIBLE); - holder.tvEmpty.setText(R.string.noRecord); + holder.tvEmpty.setText(norecord); } diff --git a/zhuike/src/main/java/com/novelbook/android/netutils/OnSuccessAndFaultSub.java b/zhuike/src/main/java/com/novelbook/android/netutils/OnSuccessAndFaultSub.java index 076de09..5b1e100 100644 --- a/zhuike/src/main/java/com/novelbook/android/netutils/OnSuccessAndFaultSub.java +++ b/zhuike/src/main/java/com/novelbook/android/netutils/OnSuccessAndFaultSub.java @@ -114,7 +114,9 @@ public class OnSuccessAndFaultSub extends DisposableObserver public void onError(Throwable e) { try { - if (e instanceof SocketTimeoutException) {//请求超时 + if (e instanceof SocketTimeoutException) { + mOnSuccessAndFaultListener.onFault("网络连接超时"); + //请求超时 } else if (e instanceof ConnectException) {//网络连接超时 // ToastManager.showShortToast("网络连接超时"); mOnSuccessAndFaultListener.onFault("网络连接超时"); diff --git a/zhuike/src/main/java/com/novelbook/android/utils/BookUtil.java b/zhuike/src/main/java/com/novelbook/android/utils/BookUtil.java index 5af2998..519734e 100644 --- a/zhuike/src/main/java/com/novelbook/android/utils/BookUtil.java +++ b/zhuike/src/main/java/com/novelbook/android/utils/BookUtil.java @@ -117,6 +117,13 @@ public class BookUtil { private Site mSite; private SiteRule mSiteRule; + private Map chaptCache = new HashMap(); + private Map chaptDownStatus = new HashMap(); + DownloadStatus downloadStatus = DownloadStatus.notStart; + + + + public NovelSites getmNovelSites() { return mNovelSites; } @@ -143,7 +150,7 @@ public class BookUtil { if (mChapters.isEmpty()) { //1. 首次打开 本地导入的书 if (bookPath == null || !bookPath.equals(mNovel.getNovelPath())) { - cleanCacheFile(); + cleanCacheFile(); this.bookPath = mNovel.getNovelPath(); bookName = FileUtils.getFileName(bookPath); cacheBook(); @@ -332,6 +339,11 @@ public class BookUtil { return false; } + private long tmpChaptLen=0; + + public void setTmpChaptLen(long tmpChaptLen) { + this.tmpChaptLen = tmpChaptLen; + } private boolean isChangeSource =false; private int mChangeChapId; @@ -342,6 +354,12 @@ public class BookUtil { Log.d(TAG, "changing Source: same site with original " + domain); return; } + + this.muluRetryCount=0; + this.downloadStatus = DownloadStatus.notStart; + chaptDownStatus.clear(); + chaptCache.clear(); + mChangeChapId = chapId; mChangeTitle =chapTitle; for (Site site:mNovelSites.getSites() ) { @@ -375,6 +393,7 @@ public class BookUtil { return f.exists(); } + private class BookTask extends AsyncTask { private String domain; private int chapId; @@ -725,8 +744,8 @@ int muluRetryCount =0; public int next(boolean back){ position += 1; - if (position > bookLen){ - position = bookLen; + if (position > tmpChaptLen){ + position = tmpChaptLen; return -1; } char result = chaptCurrent(); //current(); @@ -737,11 +756,11 @@ int muluRetryCount =0; } public char[] nextLine(){ - if (position >= bookLen){ + if (position >= tmpChaptLen){ return null; } String line = ""; - while (position < bookLen){ + while (position < tmpChaptLen){ int word = next(false); if (word == -1){ break; @@ -1147,9 +1166,7 @@ int muluRetryCount =0; } - private Map chaptCache = new HashMap(); - private Map chaptDownStatus = new HashMap(); - DownloadStatus downloadStatus = DownloadStatus.notStart; + private enum DownloadStatus{ notStart, downloading, @@ -1194,6 +1211,7 @@ int muluRetryCount =0; //获取chapter 缓存 public char[] chaptChars(final int index) { + // Log.d(TAG, String.format("prepare book begin to load content for chapter %s ------------------------------------------------------------------------->", index)); char[] block=null; if(chaptCache.containsKey(Integer.valueOf(index))) { block = chaptCache .get(index).getData().get(); diff --git a/zhuike/src/main/java/com/novelbook/android/utils/PageFactory.java b/zhuike/src/main/java/com/novelbook/android/utils/PageFactory.java index 1fba10e..0f3e172 100644 --- a/zhuike/src/main/java/com/novelbook/android/utils/PageFactory.java +++ b/zhuike/src/main/java/com/novelbook/android/utils/PageFactory.java @@ -36,9 +36,11 @@ import java.io.IOException; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; //import static com.baidu.tts.loopj.AsyncHttpClient.log; @@ -165,7 +167,7 @@ public class PageFactory implements ChangeSource{ ContentValues values = new ContentValues(); - + ConcurrentHashMap> chaptMap; private List currentChaptPages; private List nextChaptPages; private List preChaptPages; @@ -209,23 +211,20 @@ public class PageFactory implements ChangeSource{ List chaptPages = new ArrayList(); chaptPages.add(new TRPage()); + long starttime = new Date().getTime(); - - if (fileRetryCnt.containsKey(chaptId)) { - fileRetryCnt.put(chaptId, fileRetryCnt.get(chaptId) + 1); - } else { - fileRetryCnt.clear();//只保留一个章节数据 - fileRetryCnt.put(chaptId, 1); + if(chaptMap==null) { + chaptMap = new ConcurrentHashMap>(); + } + if(chaptMap.containsKey(chaptId)){ + chaptPages =chaptMap.get(chaptId); + mBookUtil.setBookLen( chaptPages.get(chaptPages.size()-1).getEnd()); + mBookUtil.setChapterNo(chaptId); + Log.d(TAG, String.format("prepare book to load chapt %s, cost %s ",chaptId ,new Date().getTime() -starttime) ); + return chaptMap.get(chaptId); } - Log.d(TAG, String.format("prepare book loadCurrentChapt %s, rertying count %s ",chaptId, fileRetryCnt.get(chaptId))); - if(fileRetryCnt.get(chaptId) > Constants.retryCnt){ - mStatus = Status.FAIL; - drawStatus(mBookPageWidget.getCurPage()); - drawStatus(mBookPageWidget.getNextPage()); - return chaptPages; - } final File file = new File(getChapterFileName(chaptId)); if (!file.exists()) { //待下载 @@ -235,15 +234,9 @@ public class PageFactory implements ChangeSource{ } - - - - if(!mBook.isLocalBook()) { mStatus = Status.OPENING; - drawStatus(mBookPageWidget.getCurPage()); - drawStatus(mBookPageWidget.getNextPage()); // final File file = new File(getChapterFileName(chaptId)); @@ -251,7 +244,25 @@ public class PageFactory implements ChangeSource{ if (!file.exists()) { - mStatus = Status.OPENING; + if (fileRetryCnt.containsKey(chaptId)) { + fileRetryCnt.put(chaptId, fileRetryCnt.get(chaptId) + 1); + } else { + fileRetryCnt.clear();//只保留一个章节数据 + fileRetryCnt.put(chaptId, 1); + } + + Log.d(TAG, String.format("prepare book loadCurrentChapt %s, rertying count %s ",chaptId, fileRetryCnt.get(chaptId))); + + if(fileRetryCnt.get(chaptId) > Constants.retryCnt){ + mStatus = Status.FAIL; + drawStatus(mBookPageWidget.getCurPage()); + drawStatus(mBookPageWidget.getNextPage()); + return chaptPages; + } + + drawStatus(mBookPageWidget.getCurPage()); + drawStatus(mBookPageWidget.getNextPage()); + if( !NetUtil.isNetworkConnected()){ //TODO: 500错误处理 mStatus = Status.NETWORKFAILE; drawStatus(mBookPageWidget.getCurPage()); @@ -303,46 +314,73 @@ public class PageFactory implements ChangeSource{ super.run(); }}.start(); - - drawStatus(mBookPageWidget.getCurPage()); drawStatus(mBookPageWidget.getNextPage()); + return chaptPages; - - - } - }/*else if(getChapters().size()==0) { - mStatus = Status.FAIL; - drawStatus(mBookPageWidget.getCurPage()); - drawStatus(mBookPageWidget.getNextPage()); - return chaptPages; - }*/ + } - chaptPages.clear(); + chaptPages =readChaptCache(chaptId); + chaptMap.put(chaptId,chaptPages); + mBookUtil.setBookLen( chaptPages.get(chaptPages.size()-1).getEnd()); + mBookUtil.setChapterNo(chaptId); + + Log.d(TAG, String.format("prepare book to load chapt %s, cost %s ",chaptId ,new Date().getTime() -starttime) ); + mStatus = Status.FINISH; + Log.d(TAG, String.format("changing Source prepare book to draw chapter %s, currentChapter %s ",chaptId ,currentChapter ) ); + /* drawStatus(mBookPageWidget.getCurPage()); + drawStatus(mBookPageWidget.getNextPage());*/ + return chaptPages; + } + + void preReadChaptCache(final int chaptId){ + if(chaptMap==null) { + chaptMap = new ConcurrentHashMap>(); + } + if(chaptMap.containsKey(chaptId)){ + return; + } + Log.d(TAG, String.format("prepare book to preLoad chapt %s, current chapt %s --->",chaptId ,currentChapter) ); + new Thread() { + @Override + public void run() { + Log.d(TAG, String.format("prepare book to preRead chapter %s ,thread.name %s",chaptId,Thread.currentThread().getName() ) ); + File file = new File(getChapterFileName(chaptId)); + if(file.exists()) { + chaptMap.put(chaptId, readChaptCache(chaptId)); + Log.d(TAG, String.format("prepare book to preLoad success " ) ); + } + Log.d(TAG, String.format("prepare book to preLoad done <-----" ) ); + super.run(); + }}.start(); + } - // chaptId = mChapters!=null && mChapters.size() <= chaptId ? 1 : chaptId; - - Log.d(TAG, String.format("changing Source prepare book to open chapter %s, currentChapter %s ",chaptId ,currentChapter ) ); - char[] chars = mBookUtil.chaptChars(chaptId); - String s = new String(chars); - // Log.d(TAG, String.format("prepare book open chapter %s,chars %s ",chaptId ,s ) ); - mBookUtil.setBookLen(chars.length); - mBookUtil.setChapterNo(chaptId); - // TRPage page = new TRPage(); + /** + * only read chapt that cached already + * @param chaptId + * @return + */ + List readChaptCache(int chaptId){ + List chaptPages = new ArrayList(); + Log.d(TAG, String.format("changing Source prepare book to open chapter %s, currentChapter %s ",chaptId ,currentChapter ) ); + char[] chars = mBookUtil.chaptChars(chaptId); + mBookUtil.setTmpChaptLen(chars.length); +// mBookUtil.setChapterNo(chaptId); + // TRPage page = new TRPage(); long length =0; int pageNo =0; while(length 0){ - cancelPage = true; - mAnimationProvider.setCancel(true); - }else { - cancelPage = false; - mAnimationProvider.setCancel(false); + if(mTouchListener.canCancel()) { + if (isNext) { + if (x - moveX > 0) { + cancelPage = true; + mAnimationProvider.setCancel(true); + } else { + cancelPage = false; + mAnimationProvider.setCancel(false); + } + } else { + if (x - moveX < 0) { + mAnimationProvider.setCancel(true); + cancelPage = true; + } else { + mAnimationProvider.setCancel(false); + cancelPage = false; + } } }else{ - if (x - moveX < 0){ - mAnimationProvider.setCancel(true); - cancelPage = true; - }else { - mAnimationProvider.setCancel(false); - cancelPage = false; - } + noNext=true; } + if(cancelPage) Log.e(TAG,"cancelPage:" + cancelPage); } @@ -309,6 +314,7 @@ public class PageWidget extends View { Boolean prePage(); Boolean nextPage(); void cancel(); + Boolean canCancel(); } } diff --git a/zhuike/src/main/res/layout/activity_book.xml b/zhuike/src/main/res/layout/activity_book.xml index a721f42..90ffdf6 100644 --- a/zhuike/src/main/res/layout/activity_book.xml +++ b/zhuike/src/main/res/layout/activity_book.xml @@ -30,7 +30,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" - app:collapsedTitleGravity="center" + app:collapsedTitleGravity="center_horizontal" app:contentScrim="?attr/colorPrimary" app:expandedTitleGravity="bottom" app:expandedTitleTextAppearance="@style/TitleText" @@ -142,8 +142,6 @@ app:contentInsetLeft="0dp" app:contentInsetStart="0dp" app:layout_collapseMode="pin" - - app:popupTheme="@style/ToolBarTheme.PopupOverlay">