• 小说阅读软件阅读界面设计


    1、引言

            我把我的小说软件中的阅读界面解析规则和相关内容进行了更新,目前已经支持上一章和下一章的切换,并且能通过目录直接跳转到指定章节,当前被展示的章节目录中对应的章节名会有明显的变色效果,目前这个加载的数据只能识别来自于搜索界面的传递的内容,感兴趣的朋友可以参考我上一篇关于小说解析的文章。

    2、代码实现

    2.1、主界面布局

    1. "1.0" encoding="utf-8"?>
    2. "http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools"
    5. android:layout_width="match_parent"
    6. android:layout_height="match_parent"
    7. tools:context=".ui.ReadActivity">
    8. android:id="@+id/wv_read"
    9. android:layout_width="match_parent"
    10. android:layout_height="match_parent"/>
    11. android:id="@+id/ll_wv_src"
    12. android:layout_width="match_parent"
    13. android:layout_height="match_parent"
    14. android:orientation="vertical"
    15. android:visibility="gone"
    16. android:background="#44404040"/>
    17. android:id="@+id/ll_lv_back"
    18. android:layout_width="match_parent"
    19. android:layout_height="match_parent"
    20. android:orientation="vertical"
    21. android:layout_marginRight="100dp"
    22. android:visibility="gone"
    23. android:background="#f7e7c5">
    24. android:id="@+id/lv_list"
    25. android:layout_marginTop="20dp"
    26. android:layout_width="match_parent"
    27. android:layout_height="match_parent"
    28. android:layout_marginRight="10dp"
    29. android:divider="#00000000"/>
    30. android:id="@+id/ll_add"
    31. android:layout_width="wrap_content"
    32. android:layout_height="wrap_content"
    33. android:background="@drawable/shape_shelf"
    34. android:gravity="center"
    35. android:layout_alignParentRight="true"
    36. android:layout_marginTop="100dp"
    37. android:visibility="gone"
    38. android:orientation="horizontal">
    39. android:id="@+id/tv_read_add"
    40. android:layout_width="wrap_content"
    41. android:layout_height="wrap_content"
    42. android:text="加入书架"
    43. android:textSize="15sp"
    44. android:textColor="#ffffff"
    45. android:layout_marginHorizontal="20dp"
    46. android:layout_marginVertical="10dp"
    47. android:visibility="visible"/>
    48. android:id="@+id/wv_load"
    49. android:layout_width="match_parent"
    50. android:layout_height="match_parent"
    51. android:visibility="gone"/>

    2.2、目录界面布局

    1. "1.0" encoding="utf-8"?>
    2. "http://schemas.android.com/apk/res/android"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:orientation="horizontal">
    6. android:id="@+id/tv_read_title"
    7. android:layout_width="wrap_content"
    8. android:layout_height="wrap_content"
    9. android:textSize="20sp"
    10. android:layout_marginLeft="10dp"
    11. android:textColor="#cabea4"
    12. android:layout_marginVertical="10dp"
    13. android:text="书名"/>

    2.3、真正阅读界面布局

            真正的阅读界面我是使用一个本地网页来展示的。

    1. "zh_CN">
    2. "Content-Type" content="text/html" charset="UTF-8">
    3. "viewport" content="width=device-width, initial-scale=1.0">
    4. 阅读页面
    5. "body">

    6. "h1_title">

    7. "div_read">


    8. "span_last" class="span_bottom" onclick="window.Android.lastChapter()">
    9. "span_list" class="span_bottom" onclick="window.Android.showList()">
    10. "span_next" class="span_bottom" onclick="window.Android.nextChapter()">


    2.4、实现代码

            目前实现代码中包含的添加历史阅读记录和添加书架数据的部分功能暂时没有修改,因此这一部分内容请忽略,待我全部修改完成后会将完整的代码提交到我的网站提供下载。

    1. package xyz.dritrtj.read.ui;
    2. import android.annotation.SuppressLint;
    3. import android.content.ContentValues;
    4. import android.content.Intent;
    5. import android.content.pm.ActivityInfo;
    6. import android.database.Cursor;
    7. import android.database.sqlite.SQLiteDatabase;
    8. import android.graphics.Bitmap;
    9. import android.graphics.BitmapFactory;
    10. import android.graphics.Color;
    11. import android.graphics.drawable.GradientDrawable;
    12. import android.os.Bundle;
    13. import android.os.Handler;
    14. import android.os.Message;
    15. import android.view.View;
    16. import android.view.ViewGroup;
    17. import android.webkit.JavascriptInterface;
    18. import android.webkit.WebSettings;
    19. import android.webkit.WebView;
    20. import android.webkit.WebViewClient;
    21. import android.widget.BaseAdapter;
    22. import android.widget.LinearLayout;
    23. import android.widget.ListView;
    24. import android.widget.TextView;
    25. import androidx.annotation.NonNull;
    26. import androidx.appcompat.app.AppCompatActivity;
    27. import xyz.dritrtj.read.R;
    28. import xyz.dritrtj.read.data.Title;
    29. import xyz.dritrtj.read.fragment.BookShelfFragment;
    30. import xyz.dritrtj.read.interfaces.Init;
    31. import xyz.dritrtj.read.utils.DBHelper;
    32. import xyz.dritrtj.read.utils.SetUiSize;
    33. import org.jsoup.Jsoup;
    34. import org.jsoup.nodes.Document;
    35. import org.jsoup.nodes.Element;
    36. import org.jsoup.select.Elements;
    37. import java.io.FileOutputStream;
    38. import java.io.IOException;
    39. import java.io.InputStream;
    40. import java.net.HttpURLConnection;
    41. import java.net.URL;
    42. import java.util.ArrayList;
    43. import java.util.List;
    44. /**
    45. * 本界面不需要适配,后面为目录添加一个水平进出的动画效果更好,然后进一步添加水平方向翻页的效果
    46. */
    47. public class ReadActivity extends AppCompatActivity implements View.OnClickListener, Init {
    48. private LinearLayout ll_lv_back;//目录的布局
    49. private ListView lv_list;
    50. private WebView wv_read;
    51. private String path;//路径
    52. private String originPath;//初始路径路径
    53. private String data;//数据
    54. private int page;//章节索引
    55. private LinearLayout ll_wv_src;//webView的遮挡布局
    56. private String name;//书名
    57. private String author;//作者
    58. private int code;//表示跳转来源
    59. private Intent intent;//用于判断跳转来源
    60. private LinearLayout ll_add;
    61. private String imagePath;//图片路径
    62. private TextView tv_read_add;
    63. private WebView wv_load;
    64. @Override
    65. protected void onCreate(Bundle savedInstanceState) {
    66. super.onCreate(savedInstanceState);
    67. setContentView(R.layout.activity_read);
    68. initView();
    69. setViewSize();
    70. setData();
    71. }
    72. private boolean isShow=true;
    73. @SuppressLint("NonConstantResourceId")
    74. @Override
    75. public void onClick(View v) {
    76. switch (v.getId()){
    77. case R.id.ll_wv_src:
    78. ll_lv_back.setVisibility(View.GONE);
    79. ll_wv_src.setVisibility(View.GONE);
    80. isShow=true;
    81. break;
    82. case R.id.ll_add:
    83. add();
    84. break;
    85. }
    86. }
    87. @SuppressLint("SetJavaScriptEnabled")
    88. @Override
    89. public void initView() {
    90. View decorView=getWindow().getDecorView();//获取当前界面的DecorView
    91. int option=View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;//更改文字颜色为深黑色
    92. decorView.setSystemUiVisibility(option);//设置系统UI元素的可见性
    93. getWindow().setNavigationBarColor(Color.TRANSPARENT);
    94. getWindow().setStatusBarColor(Color.parseColor("#ffffff"));//将状态栏设置为白色
    95. getSupportActionBar().hide();
    96. wv_read = findViewById(R.id.wv_read);
    97. lv_list = findViewById(R.id.lv_list);
    98. ll_lv_back = findViewById(R.id.ll_lv_back);
    99. ll_wv_src = findViewById(R.id.ll_wv_src);
    100. ll_wv_src.setOnClickListener(this);
    101. lv_list.setOnItemClickListener((parent, view, position, id) -> {
    102. if (page!=position){
    103. page=position;
    104. ll_lv_back.setVisibility(View.GONE);
    105. ll_wv_src.setVisibility(View.GONE);
    106. isShow=true;
    107. handler.sendEmptyMessage(3);
    108. }
    109. });
    110. ll_add = findViewById(R.id.ll_add);
    111. ll_add.setOnClickListener(this);
    112. tv_read_add = findViewById(R.id.tv_read_add);
    113. intent = getIntent();
    114. path=intent.getStringExtra("url");
    115. originPath=path;
    116. name=intent.getStringExtra("name");
    117. author=intent.getStringExtra("author");
    118. imagePath=intent.getStringExtra("imagePath");
    119. code=Integer.parseInt(intent.getStringExtra("code"));
    120. WebSettings webSettings = wv_read.getSettings();
    121. //设置支持javaScript脚步语言
    122. webSettings.setJavaScriptEnabled(true);
    123. //设置js调用java支持
    124. wv_read.addJavascriptInterface(new JavaAndJs(),"Android");
    125. //设置客户端-不跳转到默认浏览器中
    126. wv_read.setWebViewClient(new WebViewClient());
    127. wv_read.loadUrl("file:///android_asset/read.html");
    128. wv_load = findViewById(R.id.wv_load);
    129. WebSettings settings = wv_load.getSettings();
    130. settings.setCacheMode(WebSettings.LOAD_NO_CACHE);//设置回退
    131. settings.setSupportZoom(true);//支持缩放
    132. settings.setBuiltInZoomControls(true);//出现缩放工具
    133. settings.setJavaScriptEnabled(true);// 表示webview可以执行服务器端的js代码
    134. settings.setUserAgentString("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 " +
    135. "(KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36");
    136. //自适应屏幕
    137. settings.setUseWideViewPort(true);
    138. settings.setLoadWithOverviewMode(true);
    139. //自动缩放
    140. settings.setBuiltInZoomControls(true);
    141. settings.setSupportZoom(true);
    142. //支持获取手势焦点
    143. wv_load.requestFocusFromTouch();
    144. settings.setJavaScriptCanOpenWindowsAutomatically(true);//允许js弹出窗口
    145. wv_load.addJavascriptInterface(new AndroidAndJs(), "Android");
    146. wv_load.setWebViewClient(new WebViewClient(){
    147. @Override
    148. public void onPageFinished(WebView view, String url) {
    149. super.onPageFinished(view, url);
    150. if (url.startsWith("http")){
    151. if (flag==0){//加载目录
    152. jsFunction="javascript:function getDirectory() {\n" +
    153. " var list=document.getElementById('list');\n" +
    154. " var dds=list.getElementsByTagName('dd');\n" +
    155. " if(dds.length>12){\n" +
    156. " var dd;\n" +
    157. " var url;\n" +
    158. " var now_name;\n" +
    159. " var as;\n" +
    160. " var a;\n" +
    161. " for (var i = 12; i < dds.length; i++) {\n" +
    162. " dd=dds[i];\n" +
    163. " as=dd.getElementsByTagName('a');\n" +
    164. " a=as[0];\n" +
    165. " url=a.href;\n" +
    166. " now_name=a.innerHTML;\n" +
    167. " window.Android.setDirectory(url,now_name);\n" +
    168. " }\n" +
    169. " window.Android.setContent();\n" +
    170. " }\n" +
    171. " }";
    172. view.loadUrl(jsFunction);
    173. //调用 js函数
    174. view.loadUrl("javascript:getDirectory();");
    175. }
    176. if (flag==1){
    177. jsFunction="javascript:function getData() {\n" +
    178. " var div=document.getElementById('content');\n" +
    179. " var data=div.innerHTML;\n" +
    180. " window.Android.setData(data);\n" +
    181. " }";
    182. wv_load.loadUrl(jsFunction);
    183. //调用 js函数
    184. wv_load.loadUrl("javascript:getData();");
    185. }
    186. }
    187. }
    188. });
    189. wv_load.loadUrl(path);//加载章节目录
    190. }
    191. private int flag;//操作标志0代表读取目录
    192. private String jsFunction;//js函数
    193. @Override
    194. public void setViewSize() {
    195. SetUiSize.setMarginRightRelative(ll_lv_back,100);
    196. SetUiSize.setMarginTopLinear(lv_list,20);
    197. SetUiSize.setMarginRightLinear(lv_list,10);
    198. SetUiSize.setMarginTopRelative(ll_add,100);
    199. int size= (int) (20/SetUiSize.displayWidthDp*SetUiSize.displayWidth);
    200. GradientDrawable drawable = (GradientDrawable) ll_add.getBackground();
    201. drawable.setCornerRadii(new float[]{size,size,0,0,0,0,size,size});
    202. SetUiSize.setMarginTopLinear(tv_read_add,15);
    203. SetUiSize.setMarginHorizontalLinear(tv_read_add,20);
    204. SetUiSize.setMarginVerticalLinear(tv_read_add,10);
    205. }
    206. @Override
    207. public void setData() {
    208. // loadContent();
    209. }
    210. class JavaAndJs{
    211. @JavascriptInterface
    212. public void showList(){
    213. if (isShow){
    214. handler.sendEmptyMessage(2);
    215. }
    216. }
    217. //上一章
    218. @JavascriptInterface
    219. public void lastChapter(){
    220. if ((page-1)>=0){
    221. page--;
    222. handler.sendEmptyMessage(3);
    223. }
    224. }
    225. //下一章
    226. @JavascriptInterface
    227. public void nextChapter(){
    228. if ((page+1)<=list.size()-1){
    229. page++;
    230. handler.sendEmptyMessage(3);
    231. }
    232. }
    233. }
    234. private List list=<span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="245"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">private</span> ListAdapter adapter=<span class="hljs-keyword">new</span> <span class="hljs-title class_">ListAdapter</span>();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="246"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">private</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">ListAdapter</span> <span class="hljs-keyword">extends</span> <span class="hljs-title class_">BaseAdapter</span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="247"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-meta">@Override</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="248"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">public</span> <span class="hljs-type">int</span> <span class="hljs-title function_">getCount</span><span class="hljs-params">()</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="249"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">return</span> list.size();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="250"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="251"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-meta">@Override</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="252"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">public</span> Object <span class="hljs-title function_">getItem</span><span class="hljs-params">(<span class="hljs-type">int</span> position)</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="253"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">return</span> list.get(position);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="254"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="255"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-meta">@Override</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="256"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">public</span> <span class="hljs-type">long</span> <span class="hljs-title function_">getItemId</span><span class="hljs-params">(<span class="hljs-type">int</span> position)</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="257"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">return</span> position;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="258"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="259"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-meta">@Override</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="260"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">public</span> View <span class="hljs-title function_">getView</span><span class="hljs-params">(<span class="hljs-type">int</span> position, View convertView, ViewGroup parent)</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="261"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> Holder holder;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="262"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span> (convertView==<span class="hljs-literal">null</span>){</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="263"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> convertView=View.inflate(ReadActivity.<span class="hljs-built_in">this</span>,</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="264"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> R.layout.item_read,<span class="hljs-literal">null</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="265"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> holder=<span class="hljs-keyword">new</span> <span class="hljs-title class_">Holder</span>();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="266"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> holder.tv_read_title=convertView.</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="267"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> findViewById(R.id.tv_read_title);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="268"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> SetUiSize.setTextViewSize(holder.tv_read_title,<span class="hljs-number">20</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="269"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> SetUiSize.setMarginLeftLinear(holder.tv_read_title,<span class="hljs-number">10</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="270"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> SetUiSize.setMarginVerticalLinear(holder.tv_read_title,<span class="hljs-number">10</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="271"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> convertView.setTag(holder);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="272"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }<span class="hljs-keyword">else</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="273"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> holder= (Holder) convertView.getTag();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="274"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="275"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">Title</span> <span class="hljs-variable">title</span> <span class="hljs-operator">=</span> list.get(position);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="276"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> holder.tv_read_title.setText(title.chapter);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="277"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span> (page==position){</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="278"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> holder.tv_read_title.setTextColor(Color.parseColor(<span class="hljs-string">"#000000"</span>));</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="279"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }<span class="hljs-keyword">else</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="280"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> holder.tv_read_title.setTextColor(Color.parseColor(<span class="hljs-string">"#cabea4"</span>));</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="281"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="282"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">return</span> convertView;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="283"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="284"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">private</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">Holder</span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="285"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">public</span> TextView tv_read_title;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="286"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="287"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="288"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"><span class="hljs-comment">/**</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="289"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> * 加载主体数据</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="290"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> * <span class="hljs-doctag">@param</span> path url</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="291"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> */</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="292"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-meta">@SuppressLint("HandlerLeak")</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="293"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">private</span> Handler handler=<span class="hljs-keyword">new</span> <span class="hljs-title class_">Handler</span>(){</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="294"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-meta">@Override</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="295"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">handleMessage</span><span class="hljs-params">(<span class="hljs-meta">@NonNull</span> Message msg)</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="296"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">super</span>.handleMessage(msg);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="297"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">switch</span> (msg.what){</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="298"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">case</span> <span class="hljs-number">0</span>:</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="299"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> wv_read.loadUrl(<span class="hljs-string">"javascript:backStart()"</span>);<span class="hljs-comment">//将页面滑动到开始位置</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="300"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> wv_read.loadUrl(<span class="hljs-string">"javascript:showContent("</span>+<span class="hljs-string">"'"</span>+data+<span class="hljs-string">"'"</span>+<span class="hljs-string">","</span>+<span class="hljs-string">"'"</span>+list.get(page).chapter+<span class="hljs-string">"'"</span>+<span class="hljs-string">")"</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="301"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment">// update();</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="302"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">break</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="303"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">case</span> <span class="hljs-number">1</span>:<span class="hljs-comment">//加载目录</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="304"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="305"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> lv_list.setAdapter(adapter);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="306"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> handler.sendEmptyMessage(<span class="hljs-number">3</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="307"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="308"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">break</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="309"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">case</span> <span class="hljs-number">2</span>:</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="310"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> ll_lv_back.setVisibility(View.VISIBLE);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="311"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> ll_wv_src.setVisibility(View.VISIBLE);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="312"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> isShow=<span class="hljs-literal">false</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="313"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">break</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="314"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">case</span> <span class="hljs-number">3</span>:<span class="hljs-comment">//加载章节内容</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="315"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> flag=<span class="hljs-number">1</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="316"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> wv_load.loadUrl(list.get(page).path);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="317"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">break</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="318"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="319"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="320"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> };</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="321"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">loadContent</span><span class="hljs-params">(String path)</span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="322"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">Document</span> <span class="hljs-variable">document</span> <span class="hljs-operator">=</span> <span class="hljs-literal">null</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="323"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">try</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="324"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> document = Jsoup.connect(path).get();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="325"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">Element</span> <span class="hljs-variable">content</span> <span class="hljs-operator">=</span> document.getElementById(<span class="hljs-string">"content"</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="326"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">String</span> <span class="hljs-variable">html</span> <span class="hljs-operator">=</span> content.html();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="327"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> data = html.substring(<span class="hljs-number">0</span>, html.indexOf(<span class="hljs-string">"<p>"</span>)-<span class="hljs-number">5</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="328"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> handler.sendEmptyMessage(<span class="hljs-number">0</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="329"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> } <span class="hljs-keyword">catch</span> (IOException e) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="330"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">RuntimeException</span>(e);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="331"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="332"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="333"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">private</span> String tmpStr=<span class="hljs-string">""</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="334"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"><span class="hljs-comment">/**</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="335"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> * 进入主界面时加载目录和页面内容数据</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="336"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> */</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="337"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">loadContent</span><span class="hljs-params">()</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="338"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Thread</span>(){</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="339"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-meta">@Override</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="340"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">run</span><span class="hljs-params">()</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="341"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">//4.解析主体内容</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="342"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> Document document;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="343"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">try</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="344"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">//1.抓取目录和对应的章节相对路径,后面需要合成绝对路径</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="345"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> document = Jsoup.connect(path).get();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="346"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">Elements</span> <span class="hljs-variable">dl</span> <span class="hljs-operator">=</span> document.getElementsByTag(<span class="hljs-string">"dl"</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="347"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">Elements</span> <span class="hljs-variable">a</span> <span class="hljs-operator">=</span> dl.first().getElementsByTag(<span class="hljs-string">"a"</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="348"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> Title title;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="349"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">int</span> index=<span class="hljs-number">0</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="350"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">for</span> (Element element:a){</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="351"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> title=<span class="hljs-keyword">new</span> <span class="hljs-title class_">Title</span>();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="352"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> title.chapter=<span class="hljs-keyword">new</span> <span class="hljs-title class_">String</span>(element.text());<span class="hljs-comment">//目录</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="353"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> title.path=<span class="hljs-keyword">new</span> <span class="hljs-title class_">String</span>(element.attr(<span class="hljs-string">"href"</span>));<span class="hljs-comment">//相对路径</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="354"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> list.add(title);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="355"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span> (index==<span class="hljs-number">0</span>){</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="356"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> tmpStr=<span class="hljs-string">"https://www.ibiquge.la"</span>+title.path;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="357"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> index=-<span class="hljs-number">1</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="358"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="359"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="360"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span> (index==-<span class="hljs-number">1</span>){</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="361"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> handler.sendEmptyMessageDelayed(<span class="hljs-number">1</span>,<span class="hljs-number">50</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="362"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">//2.解析主体内容,判断显示是否加入书架的按钮</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="363"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span> (code==<span class="hljs-number">1</span>){<span class="hljs-comment">//如果是来源于书架,那么重新定位阅读位置</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="364"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> page= Integer.parseInt(intent.getStringExtra(<span class="hljs-string">"page"</span>));</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="365"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> tmpStr=<span class="hljs-string">"https://www.ibiquge.la"</span>+list.get(page).path;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="366"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }<span class="hljs-keyword">if</span> (code==<span class="hljs-number">2</span>){<span class="hljs-comment">//如果是来源于阅读记录,那么重新定位阅读位置</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="367"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> page= Integer.parseInt(intent.getStringExtra(<span class="hljs-string">"page"</span>));</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="368"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> tmpStr=<span class="hljs-string">"https://www.ibiquge.la"</span>+list.get(page).path;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="369"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span> (select()){</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="370"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> code=<span class="hljs-number">1</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="371"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="372"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }<span class="hljs-keyword">else</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="373"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> select();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="374"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="375"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> loadContent(tmpStr);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="376"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="377"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> } <span class="hljs-keyword">catch</span> (IOException e) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="378"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">RuntimeException</span>(e);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="379"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="380"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="381"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }.start();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="382"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="383"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"><span class="hljs-comment">/**</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="384"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> * 添加</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="385"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> */</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="386"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">add</span><span class="hljs-params">()</span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="387"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> DBHelper dbHelper=<span class="hljs-keyword">new</span> <span class="hljs-title class_">DBHelper</span>(ReadActivity.<span class="hljs-built_in">this</span>,<span class="hljs-number">1</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="388"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">SQLiteDatabase</span> <span class="hljs-variable">database</span> <span class="hljs-operator">=</span> dbHelper.getReadableDatabase();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="389"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> String sql=<span class="hljs-string">"CREATE TABLE IF NOT EXISTS shelf(\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="390"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tbook VARCHAR(20) NOT NULL,\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="391"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tauthor VARCHAR(30) NOT NULL,\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="392"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tintroduce VARCHAR(200),\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="393"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tpage VARCHAR(100),\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="394"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\torigin VARCHAR(100) NOT NULL,\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="395"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tprogress INTEGER NOT NULL\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="396"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">");"</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="397"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> database.execSQL(sql);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="398"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> ContentValues value=<span class="hljs-keyword">new</span> <span class="hljs-title class_">ContentValues</span>();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="399"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> value.put(<span class="hljs-string">"book"</span>,name);<span class="hljs-comment">//书名</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="400"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> value.put(<span class="hljs-string">"author"</span>,author);<span class="hljs-comment">//作者</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="401"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> value.put(<span class="hljs-string">"origin"</span>,originPath);<span class="hljs-comment">//书源初始路径</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="402"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> value.put(<span class="hljs-string">"progress"</span>,page);<span class="hljs-comment">//阅读进度</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="403"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> String imageName;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="404"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span> (code==<span class="hljs-number">2</span>){</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="405"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> imageName=intent.getStringExtra(<span class="hljs-string">"imageName"</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="406"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }<span class="hljs-keyword">else</span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="407"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> imageName=imagePath.substring(imagePath.lastIndexOf(<span class="hljs-string">"/"</span>) + <span class="hljs-number">1</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="408"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="409"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> value.put(<span class="hljs-string">"page"</span>,imageName);<span class="hljs-comment">//封面名字</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="410"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> database.insert(<span class="hljs-string">"shelf"</span>,<span class="hljs-literal">null</span>,value);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="411"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> database.close();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="412"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> ll_add.setVisibility(View.GONE);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="413"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Thread</span>(){</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="414"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-meta">@Override</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="415"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">run</span><span class="hljs-params">()</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="416"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">Bitmap</span> <span class="hljs-variable">bitmap</span> <span class="hljs-operator">=</span> <span class="hljs-literal">null</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="417"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">try</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="418"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">//得到连接</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="419"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">URL</span> <span class="hljs-variable">url</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">URL</span>(imagePath);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="420"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">HttpURLConnection</span> <span class="hljs-variable">connection</span> <span class="hljs-operator">=</span> (HttpURLConnection) url.openConnection();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="421"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">//设置</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="422"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> connection.setConnectTimeout(<span class="hljs-number">5000</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="423"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> connection.setReadTimeout(<span class="hljs-number">5000</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="424"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">//连接</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="425"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> connection.connect();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="426"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">//发请求读取返回的数据并封装为bitmap</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="427"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">int</span> <span class="hljs-variable">responseCode</span> <span class="hljs-operator">=</span> connection.getResponseCode();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="428"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span>(responseCode==<span class="hljs-number">200</span>) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="429"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">InputStream</span> <span class="hljs-variable">is</span> <span class="hljs-operator">=</span> connection.getInputStream();<span class="hljs-comment">//图片文件流</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="430"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">//将is封装为bitmap</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="431"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> bitmap = BitmapFactory.decodeStream(is);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="432"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> is.close();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="433"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span>(bitmap!=<span class="hljs-literal">null</span>) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="434"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">//缓存到本地</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="435"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">// /storage/sdcard/Android/data/packageName/files/</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="436"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">String</span> <span class="hljs-variable">filesPath</span> <span class="hljs-operator">=</span> getExternalFilesDir(<span class="hljs-literal">null</span>).getAbsolutePath();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="437"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">String</span> <span class="hljs-variable">fileName</span> <span class="hljs-operator">=</span> imagePath.substring(imagePath.lastIndexOf(<span class="hljs-string">"/"</span>)+<span class="hljs-number">1</span>);<span class="hljs-comment">//xxx.jpg</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="438"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">String</span> <span class="hljs-variable">filePath</span> <span class="hljs-operator">=</span> filesPath+<span class="hljs-string">"/"</span>+fileName;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="439"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> bitmap.compress(Bitmap.CompressFormat.JPEG, <span class="hljs-number">100</span>, <span class="hljs-keyword">new</span> <span class="hljs-title class_">FileOutputStream</span>(filePath));</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="440"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="441"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="442"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> connection.disconnect();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="443"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> } <span class="hljs-keyword">catch</span> (Exception e) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="444"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> e.printStackTrace();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="445"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="446"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="447"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }.start();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="448"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> BookShelfFragment.fragment.handler.sendEmptyMessageDelayed(<span class="hljs-number">0</span>,<span class="hljs-number">50</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="449"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="450"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"><span class="hljs-comment">/**</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="451"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> * 更新书架</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="452"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> */</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="453"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">update</span><span class="hljs-params">()</span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="454"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> DBHelper dbHelper=<span class="hljs-keyword">new</span> <span class="hljs-title class_">DBHelper</span>(ReadActivity.<span class="hljs-built_in">this</span>,<span class="hljs-number">1</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="455"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">SQLiteDatabase</span> <span class="hljs-variable">database</span> <span class="hljs-operator">=</span> dbHelper.getReadableDatabase();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="456"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> String sql=<span class="hljs-string">"CREATE TABLE IF NOT EXISTS shelf(\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="457"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tbook VARCHAR(20) NOT NULL,\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="458"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tauthor VARCHAR(30) NOT NULL,\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="459"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tintroduce VARCHAR(200),\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="460"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tpage VARCHAR(100),\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="461"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\torigin VARCHAR(100) NOT NULL,\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="462"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tprogress INTEGER NOT NULL\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="463"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">");"</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="464"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> database.execSQL(sql);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="465"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> ContentValues value=<span class="hljs-keyword">new</span> <span class="hljs-title class_">ContentValues</span>();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="466"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> value.put(<span class="hljs-string">"progress"</span>,page);<span class="hljs-comment">//阅读进度</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="467"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> database.update(<span class="hljs-string">"shelf"</span>,value,<span class="hljs-string">"book = ? AND author = ?"</span>,</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="468"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">new</span> <span class="hljs-title class_">String</span>[]{name,author});</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="469"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> database.close();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="470"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> updateHistory();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="471"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> BookShelfFragment.fragment.handler.sendEmptyMessage(<span class="hljs-number">0</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="472"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="473"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"><span class="hljs-comment">/**</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="474"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> * 更新历史记录</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="475"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> */</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="476"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-meta">@SuppressLint("Range")</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="477"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">updateHistory</span><span class="hljs-params">()</span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="478"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> DBHelper dbHelper=<span class="hljs-keyword">new</span> <span class="hljs-title class_">DBHelper</span>(ReadActivity.<span class="hljs-built_in">this</span>,<span class="hljs-number">1</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="479"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">SQLiteDatabase</span> <span class="hljs-variable">database</span> <span class="hljs-operator">=</span> dbHelper.getReadableDatabase();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="480"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> String sql=<span class="hljs-string">"CREATE TABLE IF NOT EXISTS history(\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="481"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tbook VARCHAR(20) NOT NULL,\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="482"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tauthor VARCHAR(30) NOT NULL,\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="483"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tintroduce VARCHAR(200),\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="484"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tpage VARCHAR(100),\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="485"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\torigin VARCHAR(100) NOT NULL,\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="486"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tprogress INTEGER NOT NULL\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="487"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">");"</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="488"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> database.execSQL(sql);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="489"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">Cursor</span> <span class="hljs-variable">shelf</span> <span class="hljs-operator">=</span> database.query(<span class="hljs-string">"history"</span>, <span class="hljs-literal">null</span>, <span class="hljs-string">"book = ? AND author = ?"</span>,</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="490"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">new</span> <span class="hljs-title class_">String</span>[]{name, author}, <span class="hljs-literal">null</span>, <span class="hljs-literal">null</span>, <span class="hljs-literal">null</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="491"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span> (!shelf.moveToNext()){</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="492"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> ContentValues value=<span class="hljs-keyword">new</span> <span class="hljs-title class_">ContentValues</span>();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="493"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> value.put(<span class="hljs-string">"book"</span>,name);<span class="hljs-comment">//书名</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="494"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> value.put(<span class="hljs-string">"author"</span>,author);<span class="hljs-comment">//作者</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="495"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> value.put(<span class="hljs-string">"origin"</span>,originPath);<span class="hljs-comment">//书源初始路径</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="496"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> value.put(<span class="hljs-string">"progress"</span>,page);<span class="hljs-comment">//阅读进度</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="497"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">String</span> <span class="hljs-variable">imageName</span> <span class="hljs-operator">=</span> imagePath.substring(imagePath.lastIndexOf(<span class="hljs-string">"/"</span>) + <span class="hljs-number">1</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="498"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> value.put(<span class="hljs-string">"page"</span>,imageName);<span class="hljs-comment">//封面名字</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="499"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> database.insert(<span class="hljs-string">"history"</span>,<span class="hljs-literal">null</span>,value);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="500"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Thread</span>(){</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="501"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-meta">@Override</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="502"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">run</span><span class="hljs-params">()</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="503"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">Bitmap</span> <span class="hljs-variable">bitmap</span> <span class="hljs-operator">=</span> <span class="hljs-literal">null</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="504"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">try</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="505"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">//得到连接</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="506"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">URL</span> <span class="hljs-variable">url</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">URL</span>(imagePath);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="507"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">HttpURLConnection</span> <span class="hljs-variable">connection</span> <span class="hljs-operator">=</span> (HttpURLConnection) url.openConnection();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="508"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">//设置</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="509"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> connection.setConnectTimeout(<span class="hljs-number">5000</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="510"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> connection.setReadTimeout(<span class="hljs-number">5000</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="511"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">//连接</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="512"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> connection.connect();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="513"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">//发请求读取返回的数据并封装为bitmap</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="514"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">int</span> <span class="hljs-variable">responseCode</span> <span class="hljs-operator">=</span> connection.getResponseCode();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="515"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span>(responseCode==<span class="hljs-number">200</span>) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="516"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">InputStream</span> <span class="hljs-variable">is</span> <span class="hljs-operator">=</span> connection.getInputStream();<span class="hljs-comment">//图片文件流</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="517"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">//将is封装为bitmap</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="518"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> bitmap = BitmapFactory.decodeStream(is);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="519"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> is.close();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="520"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span>(bitmap!=<span class="hljs-literal">null</span>) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="521"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">//缓存到本地</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="522"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment">// /storage/sdcard/Android/data/packageName/files/</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="523"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">String</span> <span class="hljs-variable">filesPath</span> <span class="hljs-operator">=</span> getExternalFilesDir(<span class="hljs-literal">null</span>).getAbsolutePath();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="524"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">String</span> <span class="hljs-variable">fileName</span> <span class="hljs-operator">=</span> imagePath.substring(imagePath.lastIndexOf(<span class="hljs-string">"/"</span>)+<span class="hljs-number">1</span>);<span class="hljs-comment">//xxx.jpg</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="525"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">String</span> <span class="hljs-variable">filePath</span> <span class="hljs-operator">=</span> filesPath+<span class="hljs-string">"/"</span>+fileName;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="526"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> bitmap.compress(Bitmap.CompressFormat.JPEG, <span class="hljs-number">100</span>, <span class="hljs-keyword">new</span> <span class="hljs-title class_">FileOutputStream</span>(filePath));</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="527"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="528"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="529"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> connection.disconnect();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="530"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> } <span class="hljs-keyword">catch</span> (Exception e) {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="531"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> e.printStackTrace();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="532"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="533"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="534"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }.start();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="535"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="536"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> ContentValues value=<span class="hljs-keyword">new</span> <span class="hljs-title class_">ContentValues</span>();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="537"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> value.put(<span class="hljs-string">"progress"</span>,page);<span class="hljs-comment">//阅读进度</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="538"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> database.update(<span class="hljs-string">"history"</span>,value,<span class="hljs-string">"book = ? AND author = ?"</span>,</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="539"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">new</span> <span class="hljs-title class_">String</span>[]{name,author});</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="540"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> database.close();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="541"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="542"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"><span class="hljs-comment">/**</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="543"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> * 查询本书是否已经加入书架</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="544"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> */</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="545"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-meta">@SuppressLint("Range")</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="546"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">private</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">select</span><span class="hljs-params">()</span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="547"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">boolean</span> isAdd;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="548"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> DBHelper dbHelper=<span class="hljs-keyword">new</span> <span class="hljs-title class_">DBHelper</span>(ReadActivity.<span class="hljs-built_in">this</span>,<span class="hljs-number">1</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="549"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">SQLiteDatabase</span> <span class="hljs-variable">database</span> <span class="hljs-operator">=</span> dbHelper.getReadableDatabase();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="550"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> String sql=<span class="hljs-string">"CREATE TABLE IF NOT EXISTS shelf(\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="551"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tbook VARCHAR(20) NOT NULL,\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="552"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tauthor VARCHAR(30) NOT NULL,\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="553"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tintroduce VARCHAR(200),\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="554"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tpage VARCHAR(100),\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="555"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\torigin VARCHAR(100) NOT NULL,\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="556"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">"\tprogress INTEGER NOT NULL\n"</span> +</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="557"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-string">");"</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="558"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> database.execSQL(sql);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="559"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-type">Cursor</span> <span class="hljs-variable">shelf</span> <span class="hljs-operator">=</span> database.query(<span class="hljs-string">"shelf"</span>, <span class="hljs-literal">null</span>, <span class="hljs-string">"book = ? AND author = ?"</span>,</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="560"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">new</span> <span class="hljs-title class_">String</span>[]{name, author}, <span class="hljs-literal">null</span>, <span class="hljs-literal">null</span>, <span class="hljs-literal">null</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="561"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">if</span> (shelf.moveToNext()){</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="562"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> page=shelf.getInt(shelf.getColumnIndex(<span class="hljs-string">"progress"</span>));</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="563"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> tmpStr=list.get(page).path;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="564"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> isAdd=<span class="hljs-literal">true</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="565"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }<span class="hljs-keyword">else</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="566"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> runOnUiThread(() -> ll_add.setVisibility(View.VISIBLE));</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="567"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> isAdd=<span class="hljs-literal">false</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="568"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="569"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> database.close();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="570"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">return</span> isAdd;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="571"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="572"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">private</span> Title title;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="573"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">private</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">AndroidAndJs</span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="574"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"><span class="hljs-comment">/**</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="575"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> * 加载目录数据</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="576"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> * <span class="hljs-doctag">@param</span> url 章节url</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="577"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> * <span class="hljs-doctag">@param</span> name 章节名</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="578"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> */</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="579"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-meta">@JavascriptInterface</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="580"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">setDirectory</span><span class="hljs-params">(String url,String name)</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="581"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> title=<span class="hljs-keyword">new</span> <span class="hljs-title class_">Title</span>();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="582"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> title.chapter=name;<span class="hljs-comment">//章节名</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="583"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> title.path=url;<span class="hljs-comment">//章节路径</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="584"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> list.add(title);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="585"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="586"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="587"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"><span class="hljs-comment">/**</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="588"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> * 目录加载完成,加载章节内容</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="589"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> */</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="590"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-meta">@JavascriptInterface</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="591"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">setContent</span><span class="hljs-params">()</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="592"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> handler.sendEmptyMessage(<span class="hljs-number">1</span>);<span class="hljs-comment">//加载显示目录</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="593"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="594"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="595"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-comment"><span class="hljs-comment">/**</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="596"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> * 显示章节内容</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="597"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> */</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="598"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-meta">@JavascriptInterface</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="599"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">setData</span><span class="hljs-params">(String now_data)</span> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="600"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> data=now_data;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="601"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> handler.sendEmptyMessage(<span class="hljs-number">0</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="602"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="603"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="604"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">}</div></div></li></ol></code><div class="hide-preCode-box"><span class="hide-preCode-bt" data-report-view="{"spm":"1001.2101.3001.7365"}"><img class="look-more-preCode contentImg-no-view" src="https://i.1000bd.com/contentImg/2022/06/27/191644837.png" alt="" title=""></span></div><div class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)"></div></pre> <h2><a name="t6"></a>3、效果展示</h2> <h3><a name="t7"></a>3.1、阅读界面展示</h3> <p>        从阅读界面中可以看出,还有部分来自于网站的广告没有去掉,这个后期再修改。目前阅读界面是使用竖屏的方式进行展示小说内容的,暂时不支持横屏切换阅读,这个功能后期再添加,每加载一个新章节后会将阅读界面滑动到开头的位置。</p> <p style="text-align:center;"><img alt="" src="https://i.1000bd.com/contentImg/2024/03/06/123835930.jpeg"></p> <h3><a name="t8"></a>3.2、底部章节<a href="https://so.csdn.net/so/search?q=%E5%88%87%E6%8D%A2%E6%8C%89%E9%92%AE&spm=1001.2101.3001.7020" target="_blank" class="hl hl-1" data-report-view="{"spm":"1001.2101.3001.7020","dest":"https://so.csdn.net/so/search?q=%E5%88%87%E6%8D%A2%E6%8C%89%E9%92%AE&spm=1001.2101.3001.7020","extra":"{\"searchword\":\"切换按钮\"}"}" data-report-click="{"spm":"1001.2101.3001.7020","dest":"https://so.csdn.net/so/search?q=%E5%88%87%E6%8D%A2%E6%8C%89%E9%92%AE&spm=1001.2101.3001.7020","extra":"{\"searchword\":\"切换按钮\"}"}" data-tit="切换按钮" data-pretit="切换按钮">切换按钮</a>展示</h3> <p>        这里我的上下章节的切换按钮和目录展示按钮是放在阅读界面底部的,虽然是竖屏展示内容,但目前并不支持将多个章节内容连接在一起自动切换展示,该该功能后期酌情添加。</p> <p style="text-align:center;"><img alt="" src="https://i.1000bd.com/contentImg/2024/03/06/123836930.jpeg"></p> <h3><a name="t9"></a> 3.3、目录展示效果</h3> <p>        目前目录是从左边弹出的,点击外部区域目录会被隐藏,我使用<a href="https://so.csdn.net/so/search?q=%E7%9B%B8%E5%AF%B9%E5%B8%83%E5%B1%80&spm=1001.2101.3001.7020" target="_blank" class="hl hl-1" data-report-view="{"spm":"1001.2101.3001.7020","dest":"https://so.csdn.net/so/search?q=%E7%9B%B8%E5%AF%B9%E5%B8%83%E5%B1%80&spm=1001.2101.3001.7020","extra":"{\"searchword\":\"相对布局\"}"}" data-report-click="{"spm":"1001.2101.3001.7020","dest":"https://so.csdn.net/so/search?q=%E7%9B%B8%E5%AF%B9%E5%B8%83%E5%B1%80&spm=1001.2101.3001.7020","extra":"{\"searchword\":\"相对布局\"}"}" data-tit="相对布局" data-pretit="相对布局">相对布局</a>的方式在目录背后填充了一层布局,用于判断是否点击目录中的内容,同时也是为了防止对其它部分进行误操作。</p> <p style="text-align:center;"><img alt="" src="https://i.1000bd.com/contentImg/2024/03/06/123835924.jpeg"></p> </div> </div> </li> <li class="list-group-item ul-li"> <b>相关阅读:</b><br> <nobr> <a href="/Article/Index/841518">用户登录功能</a> <br /> <a href="/Article/Index/1252229">使用 uni-app 开发app时 中使用的 @longpress 含义及使用方法</a> <br /> <a href="/Article/Index/981758">21. gSOAP生成ONVIF框架代码</a> <br /> <a href="/Article/Index/1001898">花了三个月,终于把个人网站写完了</a> <br /> <a href="/Article/Index/1100548">MySQL Sharding + 读写分离配置说明</a> <br /> <a href="/Article/Index/1276975">得帆云“智改数转,非同帆响”-AIGC+低代码PaaS平台系列白皮书,正式发布!</a> <br /> <a href="/Article/Index/1069176">计算机毕业设计(附源码)python自动出卷考试系统</a> <br /> <a href="/Article/Index/1554475">【BUG】Hexo|GET _MG_0001.JPG 404 (Not Found),hexo博客搭建过程图片路径正确却找不到图片</a> <br /> <a href="/Article/Index/1514406">软考69-上午题-【面向对象技术2-UML】-关系</a> <br /> <a href="/Article/Index/1129167">经济师报考专业选择及难度分析!这三个专业每年报考人数超10万!</a> <br /> </nobr> </li> <li class="list-group-item from-a mb-2"> 原文地址:https://blog.csdn.net/qq_56819189/article/details/136208096 </li> </ul> </div> <div class="col-lg-4 col-sm-12"> <ul class="list-group" style="word-break:break-all;"> <li class="list-group-item ul-li-bg" aria-current="true"> 最新文章 </li> <li class="list-group-item ul-li"> <nobr> <a href="/Article/Index/1863649">C++11 线程同步接口std::condition_variable和std::future的简单使用</a> <br /> <a href="/Article/Index/1863650">Go runtime 调度器精讲(十一):总览全局</a> <br /> <a href="/Article/Index/1863296">Spring框架漏洞总结</a> <br /> <a href="/Article/Index/1863297">Angular 18+ 高级教程 – 国际化 Internationalization i18n</a> <br /> <a href="/Article/Index/1863030">基于Tauri2+Vue3搭建桌面端程序|tauri2+vite5多窗口|消息提醒|托盘闪烁</a> <br /> <a href="/Article/Index/1863031">ComfyUI 基础教程(五) —— 应用 IP-Adapter 实现图像风格迁移</a> <br /> <a href="/Article/Index/1863295">网络空间的“边水往事”?针对华语黑产及用户进行攻击的 APT-K-UN3 活动分析</a> <br /> <a href="/Article/Index/1863554">伪装“黑神话悟空修改器”传播木马的活动分析</a> <br /> <a href="/Article/Index/1863555">全球蓝屏后,微软决定将安全踢出Windows内核</a> <br /> <a href="/Article/Index/1862606">Java读取寄存器数据的方法</a> <br /> </nobr> </li> </ul> <ul class="list-group pt-2" style="word-break:break-all;"> <li class="list-group-item ul-li-bg" aria-current="true"> 热门文章 </li> <li class="list-group-item ul-li"> <nobr> <a href="/Article/Index/888177">十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!</a> <br /> <a href="/Article/Index/797680">奉劝各位学弟学妹们,该打造你的技术影响力了!</a> <br /> <a href="/Article/Index/888183">五年了,我在 CSDN 的两个一百万。</a> <br /> <a href="/Article/Index/888179">Java俄罗斯方块,老程序员花了一个周末,连接中学年代!</a> <br /> <a href="/Article/Index/797730">面试官都震惊,你这网络基础可以啊!</a> <br /> <a href="/Article/Index/797725">你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法</a> <br /> <a href="/Article/Index/797702">心情不好的时候,用 Python 画棵樱花树送给自己吧</a> <br /> <a href="/Article/Index/797709">通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!</a> <br /> <a href="/Article/Index/797716">13 万字 C 语言从入门到精通保姆级教程2021 年版</a> <br /> <a href="/Article/Index/888192">10行代码集2000张美女图,Python爬虫120例,再上征途</a> <br /> </nobr> </li> </ul> </div> </div> </div> <!-- 主体 --> <!--body结束--> <!--这里是footer模板--> <!--footer--> <nav class="navbar navbar-inverse navbar-fixed-bottom"> <div class="container"> <div class="row"> <div class="col-md-12"> <div class="text-muted center foot-height"> Copyright © 2022 侵权请联系<a href="mailto:2656653265@qq.com">2656653265@qq.com</a>    <a href="https://beian.miit.gov.cn/" target="_blank">京ICP备2022015340号-1</a> </div> <div style="width:300px;margin:0 auto; padding:0px 5px;"> <a href="/regex.html">正则表达式工具</a> <a href="/cron.html">cron表达式工具</a> <a href="/pwdcreator.html">密码生成工具</a> </div> <div style="width:300px;margin:0 auto; padding:5px 0;"> <a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010502049817" style="display:inline-block;text-decoration:none;height:20px;line-height:20px;"> <img src="" style="float:left;" /><p style="float:left;height:20px;line-height:20px;margin: 0px 0px 0px 5px; color:#939393;">京公网安备 11010502049817号</p></a> </div> </div> </div> </div> </nav> <!--footer--> <!--footer模板结束--> <script src="/js/plugins/jquery/jquery.js"></script> <script src="/js/bootstrap.min.js"></script> <!--这里是scripts模板--> <!--scripts模板结束--> </body> </html>