下载管理
This commit is contained in:
		
							parent
							
								
									664ff9b491
								
							
						
					
					
						commit
						3c4872a58e
					
				|  | @ -12,51 +12,42 @@ | ||||||
|         android:allowBackup="true" |         android:allowBackup="true" | ||||||
|         android:icon="@mipmap/ic_launcher" |         android:icon="@mipmap/ic_launcher" | ||||||
|         android:label="@string/app_name" |         android:label="@string/app_name" | ||||||
|  |         android:launchMode="singleInstance" | ||||||
|         android:roundIcon="@mipmap/ic_launcher_round" |         android:roundIcon="@mipmap/ic_launcher_round" | ||||||
|         android:supportsRtl="true" |         android:supportsRtl="true" | ||||||
|         android:theme="@style/ToolBarTheme" |         android:theme="@style/ToolBarTheme" | ||||||
|         android:launchMode="singleInstance" |  | ||||||
|         android:usesCleartextTraffic="true"> |         android:usesCleartextTraffic="true"> | ||||||
| 
 |         <activity android:name=".view.Activitycache"></activity> | ||||||
|         <activity |         <activity | ||||||
|             android:name=".Activity_cate_books" |             android:name=".Activity_cate_books" | ||||||
|             android:label="@string/title_activity_cate_books" |             android:label="@string/title_activity_cate_books" | ||||||
|             android:launchMode="singleTask" |             android:launchMode="singleTask" | ||||||
|             android:parentActivityName=".activity_cates" |             android:parentActivityName=".activity_cates" | ||||||
|             android:theme="@style/ToolBarTheme.NoActionBar" /> |             android:theme="@style/ToolBarTheme.NoActionBar" /> | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <activity |         <activity | ||||||
|             android:name=".Activity_Search" |             android:name=".Activity_Search" | ||||||
|             android:label="@string/title_activity_cates" |             android:label="@string/title_activity_cates" | ||||||
|             android:launchMode="singleTask" |             android:launchMode="singleTask" | ||||||
|             android:parentActivityName=".Main2Activity" |             android:parentActivityName=".Main2Activity" | ||||||
|             android:theme="@style/ToolBarTheme.NoActionBar" /> |             android:theme="@style/ToolBarTheme.NoActionBar" /> | ||||||
| 
 |  | ||||||
|         <activity |         <activity | ||||||
|             android:name=".Activity_paihangbang" |             android:name=".Activity_paihangbang" | ||||||
|             android:label="@string/title_activity_paihangbang" |             android:label="@string/title_activity_paihangbang" | ||||||
|             android:parentActivityName=".Main2Activity" |             android:parentActivityName=".Main2Activity" | ||||||
|             android:theme="@style/ToolBarTheme.NoActionBar"> |             android:theme="@style/ToolBarTheme.NoActionBar"></activity> | ||||||
| 
 |  | ||||||
|         </activity> |  | ||||||
|         <activity |         <activity | ||||||
|             android:name=".Activity_ChgSource" |             android:name=".Activity_ChgSource" | ||||||
|             android:label="@string/title_Activity_ChgSource" /> |             android:label="@string/title_Activity_ChgSource" /> | ||||||
|         <activity |         <activity | ||||||
|             android:name=".BookActivity" |             android:name=".BookActivity" | ||||||
|             android:label="@string/title_activity_book" |             android:label="@string/title_activity_book" | ||||||
| 
 |  | ||||||
|             android:theme="@style/ToolBarTheme.NoActionBar" /> |             android:theme="@style/ToolBarTheme.NoActionBar" /> | ||||||
|         <activity |         <activity | ||||||
|             android:name=".ReadActivity" |             android:name=".ReadActivity" | ||||||
|             android:label="@string/app_name" |             android:label="@string/app_name" | ||||||
| 
 |             android:theme="@style/ToolBarTheme.NoActionBar"></activity> | ||||||
|             android:theme="@style/ToolBarTheme.NoActionBar"> |  | ||||||
|         </activity> |  | ||||||
|         <activity |         <activity | ||||||
|             android:name=".Main2Activity" |             android:name=".Main2Activity" | ||||||
| 
 |  | ||||||
|             android:launchMode="singleTop" |             android:launchMode="singleTop" | ||||||
|             android:theme="@style/ToolBarTheme.NoActionBar"> |             android:theme="@style/ToolBarTheme.NoActionBar"> | ||||||
|             <intent-filter> |             <intent-filter> | ||||||
|  | @ -64,28 +55,26 @@ | ||||||
| 
 | 
 | ||||||
|                 <category android:name="android.intent.category.LAUNCHER" /> |                 <category android:name="android.intent.category.LAUNCHER" /> | ||||||
|             </intent-filter> |             </intent-filter> | ||||||
| 
 |  | ||||||
|         </activity> |         </activity> | ||||||
| 
 |  | ||||||
|         <activity |         <activity | ||||||
|             android:name=".FileActivity" |             android:name=".FileActivity" | ||||||
|             android:label="@string/app_name" |             android:label="@string/app_name" | ||||||
|             android:theme="@style/ToolBarTheme.NoActionBar"> |             android:theme="@style/ToolBarTheme.NoActionBar"></activity> | ||||||
|         </activity> |  | ||||||
| 
 |  | ||||||
|         <activity |         <activity | ||||||
|             android:name=".MarkActivity" |             android:name=".MarkActivity" | ||||||
|             android:label="@string/app_name" |             android:label="@string/app_name" | ||||||
|             android:theme="@style/ToolBarTheme.NoActionBar"> |             android:theme="@style/ToolBarTheme.NoActionBar"></activity> | ||||||
|         </activity> |  | ||||||
|         <activity |         <activity | ||||||
|             android:name=".filechooser.FileChooserActivity" |             android:name=".filechooser.FileChooserActivity" | ||||||
|             android:label="@string/app_name" |             android:label="@string/app_name" | ||||||
|             android:theme="@style/ToolBarTheme.NoActionBar"> |             android:theme="@style/ToolBarTheme.NoActionBar"></activity> | ||||||
|         </activity> |         <activity | ||||||
|         <service android:name="com.novelbook.android.service.ServiceDownload"  android:exported="false"/> |             android:name=".Activity_cache" | ||||||
| 
 |             android:label="@string/title_download" | ||||||
| 
 |             android:theme="@style/ToolBarTheme.NoActionBar"></activity> | ||||||
|  |         <service | ||||||
|  |             android:name=".service.ServiceDownload" | ||||||
|  |             android:exported="false" /> | ||||||
|     </application> |     </application> | ||||||
| 
 | 
 | ||||||
| </manifest> | </manifest> | ||||||
|  | @ -2,7 +2,7 @@ | ||||||
| <litepal> | <litepal> | ||||||
|     <dbname value="book" ></dbname> |     <dbname value="book" ></dbname> | ||||||
| 
 | 
 | ||||||
|     <version value="12" ></version> |     <version value="15" ></version> | ||||||
| 
 | 
 | ||||||
|     <list> |     <list> | ||||||
|         <mapping class="com.novelbook.android.db.Chapter"></mapping> |         <mapping class="com.novelbook.android.db.Chapter"></mapping> | ||||||
|  |  | ||||||
|  | @ -0,0 +1,359 @@ | ||||||
|  | package com.novelbook.android; | ||||||
|  | 
 | ||||||
|  | import android.app.AlertDialog; | ||||||
|  | import android.content.BroadcastReceiver; | ||||||
|  | import android.content.Context; | ||||||
|  | import android.content.DialogInterface; | ||||||
|  | import android.content.Intent; | ||||||
|  | import android.content.IntentFilter; | ||||||
|  | import android.support.v7.app.AppCompatActivity; | ||||||
|  | import android.os.Bundle; | ||||||
|  | import android.support.v7.widget.GridLayoutManager; | ||||||
|  | import android.support.v7.widget.LinearLayoutManager; | ||||||
|  | import android.support.v7.widget.RecyclerView; | ||||||
|  | import android.util.Log; | ||||||
|  | import android.view.LayoutInflater; | ||||||
|  | import android.view.View; | ||||||
|  | import android.view.ViewGroup; | ||||||
|  | import android.widget.ImageView; | ||||||
|  | import android.widget.ProgressBar; | ||||||
|  | import android.widget.TextView; | ||||||
|  | 
 | ||||||
|  | import com.novelbook.android.Activity_base; | ||||||
|  | import com.novelbook.android.R; | ||||||
|  | import com.novelbook.android.bean.Cataloge; | ||||||
|  | import com.novelbook.android.db.Chapter; | ||||||
|  | import com.novelbook.android.db.DownloadTask; | ||||||
|  | import com.novelbook.android.db.Novel; | ||||||
|  | import com.novelbook.android.service.ServiceDownload; | ||||||
|  | import com.novelbook.android.utils.ImageUtil; | ||||||
|  | 
 | ||||||
|  | import org.litepal.LitePal; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  | 
 | ||||||
|  | import butterknife.BindView; | ||||||
|  | import butterknife.ButterKnife; | ||||||
|  | 
 | ||||||
|  | public class Activity_cache extends Activity_base { | ||||||
|  |     public static final String TAG=Activity_cache.class.getSimpleName(); | ||||||
|  |     @BindView(R.id.recycleView) | ||||||
|  |     RecyclerView mRecyclerView; | ||||||
|  |     private List<DownloadTask> mData; | ||||||
|  |     private CacheAdapter mAdapter; | ||||||
|  |     @Override | ||||||
|  |     public int getLayoutRes() { | ||||||
|  |         return R.layout.activitycache; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     protected void initViews() { | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     protected void setTitle() { | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     protected void initData() { | ||||||
|  |         initiDownloadReceiver(); | ||||||
|  |         mData = LitePal.findAll(DownloadTask.class); | ||||||
|  | 
 | ||||||
|  |         mAdapter = new CacheAdapter(this,mData,R.layout.recycle_list_item_cache,new  OnItemClickLitener() { | ||||||
|  |             @Override | ||||||
|  |             public void onItemClick(View view, int position) { | ||||||
|  |                 Novel novel = LitePal.find(Novel.class,mData.get(position).getNovelId()); | ||||||
|  |                 showBookDetail(novel); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             @Override | ||||||
|  |             public void onItemLongClick(View view, int position) | ||||||
|  |             { | ||||||
|  |                 final AlertDialog.Builder normalDialog = | ||||||
|  |                         new AlertDialog.Builder(Activity_cache.this); | ||||||
|  | 
 | ||||||
|  |                 normalDialog.setTitle("删除此下载任务并清除缓存吗"); | ||||||
|  |                 normalDialog.setMessage("确定删除吗?"); | ||||||
|  |                 normalDialog.setPositiveButton("取消", | ||||||
|  |                         new DialogInterface.OnClickListener() { | ||||||
|  |                             @Override | ||||||
|  |                             public void onClick(DialogInterface dialog, int which) { | ||||||
|  | 
 | ||||||
|  |                             } | ||||||
|  |                         }); | ||||||
|  |                 normalDialog.setNegativeButton("删除", | ||||||
|  |                         new DialogInterface.OnClickListener() { | ||||||
|  |                             @Override | ||||||
|  |                             public void onClick(DialogInterface dialog, int which) { | ||||||
|  |                                 DownloadTask cl = mData.get(position); | ||||||
|  |                                 cl.delete(); | ||||||
|  |                                 //   Chapter.deleteByTask(); | ||||||
|  |                                 //TODO:clear cache ? | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                                 mAdapter.removeData(position); | ||||||
|  | 
 | ||||||
|  |                             } | ||||||
|  |                         }); | ||||||
|  | 
 | ||||||
|  |                 normalDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { | ||||||
|  |                     @Override | ||||||
|  |                     public void onDismiss(DialogInterface dialog) { | ||||||
|  | 
 | ||||||
|  |                     } | ||||||
|  |                 }); | ||||||
|  |                 // 显示 | ||||||
|  |                 normalDialog.show(); | ||||||
|  |                 // mAdapter.removeData(position); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); | ||||||
|  |         mRecyclerView.setAdapter(mAdapter ); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public void fillData() { | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private IntentFilter filter; | ||||||
|  |     DownloadProcessReceiver receiver; | ||||||
|  |     void initiDownloadReceiver(){ | ||||||
|  |         filter = new IntentFilter("ServiceDownload.ChapterContent.finished"); | ||||||
|  |         filter.addCategory(Intent.CATEGORY_DEFAULT); | ||||||
|  |         receiver = new DownloadProcessReceiver(); | ||||||
|  |     } | ||||||
|  |     class DownloadProcessReceiver extends BroadcastReceiver { | ||||||
|  | 
 | ||||||
|  |         @Override | ||||||
|  |         public void onReceive(Context context, Intent intent){ | ||||||
|  |             int taskId =0; | ||||||
|  |             int progress=0; | ||||||
|  | 
 | ||||||
|  |             if( intent.hasExtra("progress")){ | ||||||
|  |                 progress = intent.getIntExtra("progress",0); | ||||||
|  |             } | ||||||
|  |             if( intent.hasExtra("taskId")){ | ||||||
|  |                 taskId = intent.getIntExtra("taskId",0); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             Log.d(TAG, String.format("onReceive: taskId %s progress %s ",taskId,progress)); | ||||||
|  |             for(DownloadTask dt : mData){ | ||||||
|  |                 if(taskId == dt.getId()){ | ||||||
|  |                     dt.setFinishedChpats(progress); | ||||||
|  |                     if(dt.getDownSatus()!=DownloadTask.DownStatus.等待下载) { | ||||||
|  |                         dt.setDownSatus(DownloadTask.DownStatus.正在下载); | ||||||
|  |                     } | ||||||
|  |                 }else{ | ||||||
|  |                     if(dt.getDownSatus()!=DownloadTask.DownStatus.正在下载) { | ||||||
|  |                         dt.setDownSatus(DownloadTask.DownStatus.排队中); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             mAdapter.setData(mData); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     private void startDownloadService(int taskId,boolean start) { | ||||||
|  |         Intent serviceIntent =  new Intent(this, ServiceDownload.class); | ||||||
|  |         serviceIntent.putExtra("taskId",taskId); | ||||||
|  |         serviceIntent.putExtra("start",start); | ||||||
|  |         startService(serviceIntent); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     protected void onResume() { | ||||||
|  |         super.onResume(); | ||||||
|  |         registerReceiver(receiver, filter); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public void onPause() { | ||||||
|  |         super.onPause(); | ||||||
|  |         unregisterReceiver(receiver); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     class CacheAdapter extends RecyclerView.Adapter<CacheAdapter.MyViewHolder> { | ||||||
|  |         private final int EMPTY_VIEW = 1; | ||||||
|  |         private final int PROGRESS_VIEW = 2; | ||||||
|  |         private final int IMAGE_VIEW = 3; | ||||||
|  | 
 | ||||||
|  |         private Context context; | ||||||
|  |         private List<DownloadTask> mDatas = new ArrayList<DownloadTask>(); | ||||||
|  |         private OnItemClickLitener mOnItemClickLitener; | ||||||
|  |         private int listItemID; | ||||||
|  | 
 | ||||||
|  |         public CacheAdapter(Context context, List<DownloadTask> mDatas, int listItemID, OnItemClickLitener clickLitener) { | ||||||
|  |             this.context = context; | ||||||
|  |             this.mDatas = mDatas; | ||||||
|  |             this.mOnItemClickLitener = clickLitener; | ||||||
|  |             this.listItemID = listItemID; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public CacheAdapter(Context context, OnItemClickLitener clickLitener) { | ||||||
|  |             this.context = context; | ||||||
|  |             this.mOnItemClickLitener = clickLitener; | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         @Override | ||||||
|  |         public int getItemViewType(int position) { | ||||||
|  |             if (mDatas.size() == 0) { | ||||||
|  |                 return EMPTY_VIEW; | ||||||
|  |             } else if (mDatas.get(position) == null) { | ||||||
|  |                 return PROGRESS_VIEW; | ||||||
|  |             } else { | ||||||
|  |                 return super.getItemViewType(position); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         @Override | ||||||
|  |         public   CacheAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { | ||||||
|  |             CacheAdapter.MyViewHolder holder = new CacheAdapter.MyViewHolder(LayoutInflater.from( | ||||||
|  |                     context).inflate(listItemID, parent, | ||||||
|  |                     false)); | ||||||
|  |             return holder; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         public void setParameters(List<DownloadTask> mDatas, int listItemID) { | ||||||
|  |             this.mDatas = mDatas; | ||||||
|  |             this.listItemID = listItemID; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener) { | ||||||
|  |             this.mOnItemClickLitener = mOnItemClickLitener; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         @Override | ||||||
|  |         public void onBindViewHolder(CacheAdapter.MyViewHolder holder, int position) { | ||||||
|  |             holder.tvTitle.setText(mDatas.get(position).getNovelTitle()); | ||||||
|  |             holder.tvSource.setText(mDatas.get(position).getDomainName()); | ||||||
|  |             boolean finished = mData.get(position).getFinishedChpats() == mData.get(position).getTotalChapts(); | ||||||
|  | 
 | ||||||
|  |            if( mData.get(position).getTotalChapts() >0) { | ||||||
|  |             float progress = mData.get(position).getFinishedChpats() *100/ mData.get(position).getTotalChapts()  ; | ||||||
|  |             holder.tvProgress.setText(String.format("%s/%s",mData.get(position).getFinishedChpats() , mData.get(position).getTotalChapts())); | ||||||
|  | 
 | ||||||
|  |             holder.tvStatus.setText( mData.get(position).getDownSatus() == DownloadTask.DownStatus.正在下载 ?"正在下载" | ||||||
|  |                     : mData.get(position).getDownSatus() == DownloadTask.DownStatus.等待下载? "暂停下载" :"休眠中"); | ||||||
|  | 
 | ||||||
|  |                holder.tvStatus.setText( mData.get(position).getStatus()==0 || mData.get(position).getFinishedChpats()  >=mData.get(position).getTotalChapts() | ||||||
|  |                        ?  holder.tvStatus.getText():"下载完成" ); | ||||||
|  | 
 | ||||||
|  |                holder.tvStatus.setText( mData.get(position).getStatus()==0?  holder.tvStatus.getText():"下载完成" ); | ||||||
|  | 
 | ||||||
|  |             holder.tvStatus.setText( mData.get(position).getDownSatus() == DownloadTask.DownStatus.排队中?"排队中": holder.tvStatus.getText() ); | ||||||
|  | 
 | ||||||
|  |             holder.barProgress.setProgress((int)progress); | ||||||
|  |            } | ||||||
|  |            // holder.imgStart.setVisibility(View.GONE); | ||||||
|  |            int img =  R.mipmap.play; | ||||||
|  |              img =  mData.get(position).getDownSatus() == DownloadTask.DownStatus.正在下载 ? R.mipmap.pause : R.mipmap.play; | ||||||
|  | 
 | ||||||
|  |             holder.imgStart.setImageResource( img); | ||||||
|  |            holder.imgStart.setOnClickListener(new View.OnClickListener() { | ||||||
|  |                @Override | ||||||
|  |                public void onClick(View v) { | ||||||
|  |                    int pos = holder.getLayoutPosition(); | ||||||
|  | 
 | ||||||
|  |                     if(mData.get(position).getDownSatus() != DownloadTask.DownStatus.正在下载) { | ||||||
|  |                         startDownloadService(mData.get(pos).getId(),true); | ||||||
|  |                         holder.imgStart.setImageResource( R.mipmap.pause); | ||||||
|  |                         mData.get(pos).setDownSatus(DownloadTask.DownStatus.排队中); | ||||||
|  | 
 | ||||||
|  |                     }else{ | ||||||
|  |                         startDownloadService(mData.get(pos).getId(),false); | ||||||
|  |                         holder.imgStart.setImageResource( R.mipmap.play); | ||||||
|  |                         mData.get(pos).setDownSatus(DownloadTask.DownStatus.等待下载); | ||||||
|  |                     } | ||||||
|  |                    mData.get(pos).update( mData.get(pos).getId()); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                } | ||||||
|  |            }); | ||||||
|  | 
 | ||||||
|  |             // 如果设置了回调,则设置点击事件 | ||||||
|  |             if (mOnItemClickLitener != null) { | ||||||
|  |                 holder.itemView.setOnClickListener(new View.OnClickListener() { | ||||||
|  |                     @Override | ||||||
|  |                     public void onClick(View v) { | ||||||
|  |                         int pos = holder.getLayoutPosition(); | ||||||
|  |                         mOnItemClickLitener.onItemClick(holder.itemView, pos); | ||||||
|  |                     } | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { | ||||||
|  |                 @Override | ||||||
|  |                 public boolean onLongClick(View v) { | ||||||
|  |                     int pos = holder.getLayoutPosition(); | ||||||
|  |                     mOnItemClickLitener.onItemLongClick(holder.itemView, pos); | ||||||
|  |                     return false; | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |              | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         @Override | ||||||
|  |         public int getItemCount() { | ||||||
|  |             return mDatas.size(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public void addData(int position) { | ||||||
|  |             //   mDatas.add(position, "Insert One"); | ||||||
|  |             //    notifyItemInserted(position); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public void removeData(int position) { | ||||||
|  |             mDatas.remove(position); | ||||||
|  |             notifyItemRemoved(position); | ||||||
|  |             notifyDataSetChanged(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public void setData(List<DownloadTask> data) { | ||||||
|  |             mData = data; | ||||||
|  |             notifyDataSetChanged(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         class MyViewHolder extends RecyclerView.ViewHolder { | ||||||
|  |             @BindView(R.id.tvTitle) | ||||||
|  |             TextView tvTitle; | ||||||
|  |             @BindView(R.id.tvProgress) | ||||||
|  |             TextView tvProgress; | ||||||
|  |             @BindView(R.id.tvStatus) | ||||||
|  |             TextView tvStatus; | ||||||
|  |             @BindView(R.id.barProgress) | ||||||
|  |             ProgressBar barProgress; | ||||||
|  |             @BindView(R.id.imgStart) | ||||||
|  |             ImageView imgStart; | ||||||
|  |             @BindView(R.id.tvSource) | ||||||
|  |             TextView tvSource; | ||||||
|  |             public MyViewHolder(View view) { | ||||||
|  |                 super(view); | ||||||
|  |                 ButterKnife.bind(this, view); | ||||||
|  |                 //tvTitle = (TextView) view.findViewById(R.id.title); | ||||||
|  |                 // tvAuthor = (TextView) view.findViewById(R.id.author); | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     interface OnItemClickLitener | ||||||
|  |     { | ||||||
|  |         void onItemClick(View view, int position); | ||||||
|  | 
 | ||||||
|  |         void onItemLongClick(View itemView, int pos); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -29,9 +29,9 @@ public static String TAG ="com.novelbook.android.paihangbang"; | ||||||
|     ViewPager mViewpager; |     ViewPager mViewpager; | ||||||
|     @BindView(R.id.tab_layout) |     @BindView(R.id.tab_layout) | ||||||
|     SlidingTabLayout tabLayout; |     SlidingTabLayout tabLayout; | ||||||
|     public static String EXTR_FN="fn"; |     public static final String EXTR_FN="fn"; | ||||||
|     public static String EXTR_TITLE="title"; |     public static final String EXTR_TITLE="title"; | ||||||
|     public static String EXTR_BANGDAN ="bangdan"; |     public static final String EXTR_BANGDAN ="bangdan"; | ||||||
|     public static final String EXTR_SEARCH ="search"; |     public static final String EXTR_SEARCH ="search"; | ||||||
|     public static final String EXTR_HISTORY ="history" ; |     public static final String EXTR_HISTORY ="history" ; | ||||||
|     private ArrayList<Fragment> mFragments; |     private ArrayList<Fragment> mFragments; | ||||||
|  |  | ||||||
|  | @ -353,6 +353,10 @@ public class BookActivity extends   Activity_base { | ||||||
|                 Toast.makeText(BookActivity.this, "已加入下载队列1", Toast.LENGTH_LONG).show(); |                 Toast.makeText(BookActivity.this, "已加入下载队列1", Toast.LENGTH_LONG).show(); | ||||||
|             } else if (msg.what == 3) { |             } else if (msg.what == 3) { | ||||||
|                 Toast.makeText(BookActivity.this, "获取目录信息失败,下载失败", Toast.LENGTH_LONG).show(); |                 Toast.makeText(BookActivity.this, "获取目录信息失败,下载失败", Toast.LENGTH_LONG).show(); | ||||||
|  |             }else if (msg.what == 4) { | ||||||
|  |                 Toast.makeText(BookActivity.this, String.format("亲,小说《%s》已经缓存完成了", mNovel.getName()), Toast.LENGTH_LONG).show(); | ||||||
|  |             }else if (msg.what == 5) { | ||||||
|  |                 Toast.makeText(BookActivity.this, String.format("亲,小说《%s》已经在缓存队列了,请耐心等待", mNovel.getName()), Toast.LENGTH_LONG).show(); | ||||||
|             } |             } | ||||||
|             hideProgress(); |             hideProgress(); | ||||||
|         } |         } | ||||||
|  | @ -420,20 +424,7 @@ public class BookActivity extends   Activity_base { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|        // if (LitePal.where("novelId = ?", mNovel.getId() + "").count("DownloadTask") > 0) { |        // if (LitePal.where("novelId = ?", mNovel.getId() + "").count("DownloadTask") > 0) { | ||||||
|             List<DownloadTask> dts = LitePal.where("novelId = ?", mNovel.getId() + "").limit(1).find(DownloadTask.class); |  | ||||||
|             if (dts.size() > 0) { |  | ||||||
|                 if (dts.get(0).getStatus() == 1) { |  | ||||||
|                     Toast.makeText(this, String.format("亲,小说《%s》已经缓存完成了", mNovel.getName()), Toast.LENGTH_LONG).show(); |  | ||||||
| 
 | 
 | ||||||
|                 } else { |  | ||||||
|                     Toast.makeText(this, String.format("亲,小说《%s》已经在缓存队列了,请耐心等待", mNovel.getName()), Toast.LENGTH_LONG).show(); |  | ||||||
|                     startDownloadService(dts.get(0).getId()); |  | ||||||
|                     // startService( getSvrIntent()); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 return; |  | ||||||
| 
 |  | ||||||
|             } |  | ||||||
|        // } |        // } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -454,16 +445,40 @@ public class BookActivity extends   Activity_base { | ||||||
|                     handler.sendEmptyMessage(3); |                     handler.sendEmptyMessage(3); | ||||||
| 
 | 
 | ||||||
|                 } else { |                 } else { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                     List<DownloadTask> dts = LitePal.where("novelId = ? and domain =?", mNovel.getId() + "",mNovel.getDomain()).limit(1).find(DownloadTask.class); | ||||||
|  |                     if (dts.size() > 0) { | ||||||
|  |                         if (dts.get(0).getStatus() == 1) { | ||||||
|  | 
 | ||||||
|  |                             handler.sendEmptyMessage(4); | ||||||
|  | 
 | ||||||
|  |                         } else { | ||||||
|  |                             handler.sendEmptyMessage(5); | ||||||
|  | 
 | ||||||
|  |                             startDownloadService(dts.get(0).getId()); | ||||||
|  |                             // startService( getSvrIntent()); | ||||||
|  |                         } | ||||||
|  | 
 | ||||||
|  |                         return; | ||||||
|  | 
 | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|                     DownloadTask dt = new DownloadTask(); |                     DownloadTask dt = new DownloadTask(); | ||||||
|                     dt.setDomain(mNovel.getDomain()); |                     dt.setDomain(mNovel.getDomain()); | ||||||
|  |                     dt.setDomainName(mNovel.getDomainName()); | ||||||
|                     dt.setFinishedChpats(0); |                     dt.setFinishedChpats(0); | ||||||
|                     dt.setNovelId(mNovel.getId()); |                     dt.setNovelId(mNovel.getId()); | ||||||
|                     dt.setStatus(0); |                     dt.setStatus(0); | ||||||
|                     dt.setTotalChapts(mNovel.getTotalChapts()); |                    // dt.setTotalChapts(mNovel.getChaptCnt()); | ||||||
|  |                     dt.setTotalChapts(pageFactory.getChapters().size()); | ||||||
|  |                     dt.setNovelTitle(mNovel.getName()); | ||||||
|  | 
 | ||||||
|                     dt.save(); |                     dt.save(); | ||||||
|                     //  LitePal.deleteAll("chapter","novelId=?",mNovel.getId()+""); |                     //  LitePal.deleteAll("chapter","novelId=?",mNovel.getId()+""); | ||||||
|                     for (Chapter chapter : pageFactory.getChapters()) { |                     for (Chapter chapter : pageFactory.getChapters()) { | ||||||
|                         chapter.setNovelId(mNovel.getId()); |                         chapter.setNovelId(mNovel.getId()); | ||||||
|  |                         chapter.setTaskId(dt.getId()); | ||||||
|                         chapter.save(); |                         chapter.save(); | ||||||
|                     } |                     } | ||||||
|                    startDownloadService(dt.getId()); |                    startDownloadService(dt.getId()); | ||||||
|  |  | ||||||
|  | @ -31,6 +31,7 @@ import com.novelbook.android.Fragments.Fragment_paihang; | ||||||
| import com.novelbook.android.netsubscribe.BookSubscribe; | import com.novelbook.android.netsubscribe.BookSubscribe; | ||||||
| import com.novelbook.android.netutils.OnSuccessAndFaultListener; | import com.novelbook.android.netutils.OnSuccessAndFaultListener; | ||||||
| import com.novelbook.android.netutils.OnSuccessAndFaultSub; | import com.novelbook.android.netutils.OnSuccessAndFaultSub; | ||||||
|  | import com.novelbook.android.service.ServiceDownload; | ||||||
| import com.novelbook.android.utils.Config; | import com.novelbook.android.utils.Config; | ||||||
| import com.novelbook.android.utils.Constants; | import com.novelbook.android.utils.Constants; | ||||||
| import com.novelbook.android.utils.GsonUtil; | import com.novelbook.android.utils.GsonUtil; | ||||||
|  | @ -268,8 +269,10 @@ public class Main2Activity extends Activity_base | ||||||
|             intent.putExtra(Activity_paihangbang.EXTR_HISTORY,"yes"); |             intent.putExtra(Activity_paihangbang.EXTR_HISTORY,"yes"); | ||||||
|             intent.putExtra(Activity_paihangbang.EXTR_TITLE,"我曾经看过的书"); |             intent.putExtra(Activity_paihangbang.EXTR_TITLE,"我曾经看过的书"); | ||||||
|             startActivity(intent); |             startActivity(intent); | ||||||
|         } else if (id == R.id.nav_slideshow) { |         } else if (id == R.id.nav_huancun) { | ||||||
| 
 |             startDownloadService(); | ||||||
|  |             Intent intent = new Intent(Main2Activity.this,Activity_cache.class); | ||||||
|  |             startActivity(intent); | ||||||
|         } else if (id == R.id.nav_manage) { |         } else if (id == R.id.nav_manage) { | ||||||
| 
 | 
 | ||||||
|         } else if (id == R.id.nav_share) { |         } else if (id == R.id.nav_share) { | ||||||
|  | @ -282,7 +285,11 @@ public class Main2Activity extends Activity_base | ||||||
|         drawer.closeDrawer(GravityCompat.START); |         drawer.closeDrawer(GravityCompat.START); | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  |     private void startDownloadService() { | ||||||
|  |         Intent serviceIntent = new Intent(this, ServiceDownload.class); | ||||||
| 
 | 
 | ||||||
|  |         startService(serviceIntent); | ||||||
|  |     } | ||||||
|     private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener |     private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener | ||||||
|             = new BottomNavigationView.OnNavigationItemSelectedListener() { |             = new BottomNavigationView.OnNavigationItemSelectedListener() { | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,12 +1,17 @@ | ||||||
| package com.novelbook.android.db; | package com.novelbook.android.db; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | import android.text.TextUtils; | ||||||
|  | 
 | ||||||
| import org.litepal.LitePal; | import org.litepal.LitePal; | ||||||
| import org.litepal.crud.LitePalSupport; | import org.litepal.crud.LitePalSupport; | ||||||
| 
 | 
 | ||||||
| import java.io.Serializable; | import java.io.Serializable; | ||||||
|  | import java.util.ArrayList; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| 
 | 
 | ||||||
|  | import javax.security.auth.callback.CallbackHandler; | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| public class  Chapter extends LitePalSupport implements Serializable { | public class  Chapter extends LitePalSupport implements Serializable { | ||||||
|     private int id; |     private int id; | ||||||
|  | @ -19,6 +24,9 @@ public class  Chapter extends LitePalSupport implements Serializable { | ||||||
|     private String chapterPath; //缓存地址 |     private String chapterPath; //缓存地址 | ||||||
|     private String domain; //目标 site |     private String domain; //目标 site | ||||||
|     private int index;//第几章 |     private int index;//第几章 | ||||||
|  |     private int taskId; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|     public static Chapter getChapter(int id, String domain, int chapId) { |     public static Chapter getChapter(int id, String domain, int chapId) { | ||||||
|         // Chapter chapter  =(Chapter) |         // Chapter chapter  =(Chapter) | ||||||
|  | @ -37,7 +45,13 @@ public class  Chapter extends LitePalSupport implements Serializable { | ||||||
|         chapter.setChapterPath(""); |         chapter.setChapterPath(""); | ||||||
|         return chapter; |         return chapter; | ||||||
|     } |     } | ||||||
|  |     public int getTaskId() { | ||||||
|  |         return taskId; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|  |     public void setTaskId(int taskId) { | ||||||
|  |         this.taskId = taskId; | ||||||
|  |     } | ||||||
|     public int getIndex() { |     public int getIndex() { | ||||||
|         return index; |         return index; | ||||||
|     } |     } | ||||||
|  | @ -118,10 +132,18 @@ public class  Chapter extends LitePalSupport implements Serializable { | ||||||
|         this.chapterPath = chapterPath; |         this.chapterPath = chapterPath; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public static List<Chapter> getUnCachedChapters(int noveId,String domain ){ |     public static List<Chapter> getUnCachedChapters(int taskId){ | ||||||
|        //  return LitePal.where("novelId = ? and domain = ? and chapterPath = null" ,noveId+"",domain ) .find(Chapter.class); |        //  return LitePal.where("novelId = ? and domain = ? and chapterPath = null" ,noveId+"",domain ) .find(Chapter.class); | ||||||
| 
 |         //ist<Chapter> lst = LitePal.where("novelId = ? and domain = ?  " ,noveId+"",domain).find(Chapter.class); | ||||||
|          return LitePal.where("novelId = ? and domain = ?  " ,noveId+"",domain).find(Chapter.class); |         List<Chapter> lst = LitePal.where("taskId= ? " ,taskId+"").find(Chapter.class); | ||||||
|  |         List<Chapter> lstrt = new ArrayList<Chapter>(); | ||||||
|  |         for(Chapter chapter : lst){ | ||||||
|  |             if(TextUtils.isEmpty(chapter.getChapterPath())){ | ||||||
|  |                 lstrt.add(chapter); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return  lstrt; | ||||||
|  |       //  return LitePal.where("novelId = ? and domain = ?  " ,noveId+"",domain).find(Chapter.class); | ||||||
| 
 | 
 | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -9,11 +9,38 @@ public class DownloadTask extends LitePalSupport implements Serializable { | ||||||
| 
 | 
 | ||||||
|     private int id; |     private int id; | ||||||
|     private int novelId; |     private int novelId; | ||||||
|  |     private String novelTitle; | ||||||
|     private String domain; |     private String domain; | ||||||
|  |     private String domainName; | ||||||
|     @Column( defaultValue = "0") |     @Column( defaultValue = "0") | ||||||
|     private int status; //0 未完成 1 完成 |     private int status; //0 未完成 1 完成 | ||||||
|     private int totalChapts; |     private int totalChapts; | ||||||
|     private int finishedChpats; |     private int finishedChpats; | ||||||
|  |     private DownStatus downSatus =DownStatus.初始状态;//0 队列外 1 队列内 | ||||||
|  | 
 | ||||||
|  |     public DownStatus getDownSatus() { | ||||||
|  |         return downSatus; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setDownSatus(DownStatus downSatus) { | ||||||
|  |         this.downSatus = downSatus; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getNovelTitle() { | ||||||
|  |         return novelTitle; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setNovelTitle(String novelTitle) { | ||||||
|  |         this.novelTitle = novelTitle; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getDomainName() { | ||||||
|  |         return domainName; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setDomainName(String domainName) { | ||||||
|  |         this.domainName = domainName; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     public int getTotalChapts() { |     public int getTotalChapts() { | ||||||
|         return totalChapts; |         return totalChapts; | ||||||
|  | @ -63,6 +90,9 @@ public class DownloadTask extends LitePalSupport implements Serializable { | ||||||
|         this.status = status; |         this.status = status; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     public  static enum DownStatus{ | ||||||
|  |        初始状态,等待下载, 正在下载,排队中,下载完成 | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -24,6 +24,7 @@ public class Novel extends LitePalSupport implements Serializable{ | ||||||
|     private String name; |     private String name; | ||||||
|     private String infoUrl; |     private String infoUrl; | ||||||
|     private String domain; |     private String domain; | ||||||
|  |     private String domainName; | ||||||
|     private String muluUrl; |     private String muluUrl; | ||||||
|     private String novelPath; |     private String novelPath; | ||||||
|     private long lastReadPos; |     private long lastReadPos; | ||||||
|  | @ -61,7 +62,13 @@ public class Novel extends LitePalSupport implements Serializable{ | ||||||
|         this.readtime = readtime; |         this.readtime = readtime; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     public String getDomainName() { | ||||||
|  |         return domainName; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|  |     public void setDomainName(String domainName) { | ||||||
|  |         this.domainName = domainName; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     public long getLastVisit() { |     public long getLastVisit() { | ||||||
|         return lastVisit; |         return lastVisit; | ||||||
|  | @ -127,17 +134,7 @@ public class Novel extends LitePalSupport implements Serializable{ | ||||||
|         this.progress = progress; |         this.progress = progress; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public int getTotalChapts() { |      public int getId() { | ||||||
|         return totalChapts; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public void setTotalChapts(int totalChapts) { |  | ||||||
|         this.totalChapts = totalChapts; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private int totalChapts; |  | ||||||
| 
 |  | ||||||
|     public int getId() { |  | ||||||
|         return id; |         return id; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,8 +1,11 @@ | ||||||
| package com.novelbook.android.service; | package com.novelbook.android.service; | ||||||
| 
 | 
 | ||||||
| import android.app.IntentService; | import android.app.IntentService; | ||||||
|  | import android.app.Service; | ||||||
| import android.content.Intent; | import android.content.Intent; | ||||||
|  | import android.os.Bundle; | ||||||
| import android.os.Handler; | import android.os.Handler; | ||||||
|  | import android.os.IBinder; | ||||||
| import android.os.Message; | import android.os.Message; | ||||||
| import android.text.TextUtils; | import android.text.TextUtils; | ||||||
| import android.util.Log; | import android.util.Log; | ||||||
|  | @ -15,6 +18,7 @@ import com.novelbook.android.netutils.HttpMethods; | ||||||
| import com.novelbook.android.utils.BookUtil; | import com.novelbook.android.utils.BookUtil; | ||||||
| 
 | 
 | ||||||
| import com.novelbook.android.utils.NovelParseUtil; | import com.novelbook.android.utils.NovelParseUtil; | ||||||
|  | import com.novelbook.android.utils.PageFactory; | ||||||
| 
 | 
 | ||||||
| import org.json.JSONException; | import org.json.JSONException; | ||||||
| import org.json.JSONObject; | import org.json.JSONObject; | ||||||
|  | @ -41,7 +45,7 @@ import okhttp3.Response; | ||||||
| import okhttp3.ResponseBody; | import okhttp3.ResponseBody; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| public class ServiceDownload extends IntentService { | public class ServiceDownload extends Service { | ||||||
|     private static final String TAG ="ServiceDownload" ; |     private static final String TAG ="ServiceDownload" ; | ||||||
| 
 | 
 | ||||||
|     private   final String storagePath = BookUtil.storagePath; |     private   final String storagePath = BookUtil.storagePath; | ||||||
|  | @ -57,9 +61,9 @@ public class ServiceDownload extends IntentService { | ||||||
|    // public ServiceDownload(String name) { |    // public ServiceDownload(String name) { | ||||||
|   //      super(name); |   //      super(name); | ||||||
|   //  } |   //  } | ||||||
|     public ServiceDownload() { |   /*  public ServiceDownload() { | ||||||
|         super("ServiceDownload"); |         super("ServiceDownload"); | ||||||
|     } |     }*/ | ||||||
| 
 | 
 | ||||||
|      private Map<Integer,SiteRule>  siteRuleMap = new HashMap<Integer,SiteRule>()  ;  // key = novelId |      private Map<Integer,SiteRule>  siteRuleMap = new HashMap<Integer,SiteRule>()  ;  // key = novelId | ||||||
|      private DownloadTask processingTask  ; |      private DownloadTask processingTask  ; | ||||||
|  | @ -67,6 +71,7 @@ public class ServiceDownload extends IntentService { | ||||||
|      private int chaptIndex=0; |      private int chaptIndex=0; | ||||||
| 
 | 
 | ||||||
|     private Map<Integer ,List<Chapter>> tasksMap = new  ConcurrentHashMap<Integer, List<Chapter>>();// key = taskId |     private Map<Integer ,List<Chapter>> tasksMap = new  ConcurrentHashMap<Integer, List<Chapter>>();// key = taskId | ||||||
|  |     private Map<Integer ,List<Chapter>> tasksMapDone = new  ConcurrentHashMap<Integer, List<Chapter>>();// key = taskId | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public void onCreate() { |     public void onCreate() { | ||||||
|  | @ -91,18 +96,23 @@ public class ServiceDownload extends IntentService { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|     } |     } | ||||||
|  |     @Override | ||||||
|  |     public int onStartCommand(Intent intent, int flags, int startId){ | ||||||
|  |         // // QLog.getLogger().d( TAG,TAG+"... service NaviSvc onStartCommand.....," ); | ||||||
|  |         onHandleIntent(intent); | ||||||
|  |         // We want this service to continue running until it is explicitly | ||||||
|  |         // stopped, so return sticky. | ||||||
|  | //		return START_NOT_STICKY;		//TODO: checking why can not stop the service. | ||||||
|  |         return START_STICKY; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|     @Override |     @Override | ||||||
|     public void onStart(Intent intent, int startId) { |     public void onStart(Intent intent, int startId) { | ||||||
|         super.onStart(intent, startId); |         super.onStart(intent, startId); | ||||||
|         Log.d(TAG,"test service onStart"); |         Log.d(TAG,"test service onStart"); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Override |  | ||||||
|     public int onStartCommand(Intent intent, int flags, int startId) { |  | ||||||
|         Log.d(TAG,"test service onStartCommand"); |  | ||||||
|         return super.onStartCommand(intent, flags, startId); |  | ||||||
| 
 |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public void onDestroy() { |     public void onDestroy() { | ||||||
|  | @ -110,65 +120,197 @@ public class ServiceDownload extends IntentService { | ||||||
|         super.onDestroy(); |         super.onDestroy(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     @Override | ||||||
|  |     public IBinder onBind(Intent intent) { | ||||||
|  |         // TODO Auto-generated method stub | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|     private List<DownloadTask> downloadTasks = new ArrayList<DownloadTask>(); |     private List<DownloadTask> downloadTasks = new ArrayList<DownloadTask>(); | ||||||
| 
 | 
 | ||||||
|     @Override |     List<Integer> cancelId =new ArrayList<Integer>(); | ||||||
|  | 
 | ||||||
|     protected void onHandleIntent( Intent intent) { |     protected void onHandleIntent( Intent intent) { | ||||||
|         Log.d(TAG,"test service onHandleIntent...begin"); |         Log.d(TAG,"ServiceDownload onHandleIntent...begin"); | ||||||
| 
 | 
 | ||||||
|         String key ="taskId"; |         String key ="taskId"; | ||||||
|         int taskId =0; |         int taskId =0; | ||||||
|  | 
 | ||||||
|         if(intent.hasExtra(key)){ |         if(intent.hasExtra(key)){ | ||||||
|             taskId=	intent.getExtras().getInt(key); |             taskId=	intent.getExtras().getInt(key); | ||||||
|             startNewTask(taskId); |             DownloadTask dt = LitePal.find(DownloadTask.class,taskId); | ||||||
|  | 
 | ||||||
|  |             if(intent.hasExtra("start")){ | ||||||
|  |                 if(!intent.getBooleanExtra("start",true)){ | ||||||
|  |                     cancelId.add(taskId); | ||||||
|  |                     for(DownloadTask  t : downloadTasks){ | ||||||
|  |                         if( t.getId() == taskId){ | ||||||
|  |                              t.setDownSatus(DownloadTask.DownStatus.等待下载); | ||||||
|  |                             break; | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                     stopTask(taskId); | ||||||
|  | 
 | ||||||
|  |                 }else{ | ||||||
|  |                     boolean newTask = true; | ||||||
|  | 
 | ||||||
|  |                     if(cancelId.contains(taskId)){ | ||||||
|  |                         cancelId.remove(cancelId.indexOf(taskId)); | ||||||
|  |                     } | ||||||
|  |                     for(DownloadTask  t : downloadTasks){ | ||||||
|  |                         if(t.getId() == taskId){ | ||||||
|  |                             newTask =false; | ||||||
|  |                             break; | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                     if(newTask) { | ||||||
|  |                         startNewTask(dt); | ||||||
|  |                     } else { | ||||||
|  | 
 | ||||||
|  |                         for (DownloadTask t : downloadTasks) { | ||||||
|  |                             if (t.getId() == taskId) { | ||||||
|  |                                 t.setDownSatus(DownloadTask.DownStatus.正在下载); | ||||||
|  |                                 break; | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                     startTask(taskId); | ||||||
|  | 
 | ||||||
|  |                     if(taskIndex==0) { | ||||||
|  | 
 | ||||||
|  |                         //  handler.sendEmptyMessage(1); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|         } |         } | ||||||
|         else{ |         else{ | ||||||
|           /*  if(processingTask==null) { |             Log.d(TAG,"ServiceDownload  downloadTask size: " +downloadTasks.size()); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                 new Thread() { | ||||||
|  | 
 | ||||||
|  |                     @Override | ||||||
|  |                     public void run() { | ||||||
|  |                         List<DownloadTask> tmp = LitePal.findAll(DownloadTask.class); | ||||||
|  | 
 | ||||||
|  |                         if (downloadTasks.size() == 0) { | ||||||
|  |                             taskIndex = 0; | ||||||
|  |                             for (DownloadTask dt : tmp) { | ||||||
|  |                                 startNewTask(dt); | ||||||
|  |                             } | ||||||
|  | 
 | ||||||
|  |                         }else{ | ||||||
|  | 
 | ||||||
|  |                             for (DownloadTask dt : tmp) { | ||||||
|  |                                 boolean exist = false; | ||||||
|  |                                 for(DownloadTask t: downloadTasks){ | ||||||
|  |                                     if(t.getId() == dt.getId()){ | ||||||
|  |                                         exist =true; | ||||||
|  |                                         break; | ||||||
|  |                                     } | ||||||
|  |                                 } | ||||||
|  |                                 if(!exist){ | ||||||
|  |                                     startNewTask(dt); | ||||||
|  |                                 } | ||||||
|  | 
 | ||||||
|  |                             } | ||||||
|  | 
 | ||||||
|  |                         } | ||||||
|  |                         if (taskIndex == 0) { | ||||||
|  |                             startTask(); | ||||||
|  |                             //  handler.sendEmptyMessage(1); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 }.start(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |           /* | ||||||
|  |              if(processingTask==null) { | ||||||
|                 startTask(); |                 startTask(); | ||||||
|             }*/ |             }*/ | ||||||
|         } |         } | ||||||
|         Log.d(TAG,"test service onHandleIntent...over"); |         Log.d(TAG,"ServiceDownload test service onHandleIntent...over"); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|     Handler handler = new Handler()  { |     Handler handler = new Handler()  { | ||||||
|         @Override |         @Override | ||||||
|         public void handleMessage(Message msg) { |         public void handleMessage(Message msg) { | ||||||
|             if(msg.what ==1){ |        /*     if(msg.what ==1){ | ||||||
|                 startTask(); |                 startTask(); | ||||||
|             }else if(msg.what==2){ |             }else*/ | ||||||
|  |                 if(msg.what==2){ | ||||||
|  |                 int tIndex = msg.getData().getInt("tIndex"); | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  |                 if(tIndex>=downloadTasks.size()) { | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                 int taskId = downloadTasks.get(tIndex).getId(); | ||||||
|  |                /* if( downloadTasks.get(taskId).getDownSatus() == DownloadTask.DownStatus.等待下载){ | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|                 if(tasksMap.get(processingTask.getId())==null){ |                 if(tasksMap.get(processingTask.getId())==null){ | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|  |                 */ | ||||||
|  | 
 | ||||||
|  |                 if(tasksMap.get(taskId)==null){ | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|                 Log.d(TAG,String.format("%s start new chapt download---- taskId :%s, chapter count %s,chaptIndex %s",TAG |                 Log.d(TAG,String.format("%s start new chapt download---- taskId :%s, chapter count %s,chaptIndex %s",TAG | ||||||
|                         , processingTask.getId(), |                         , processingTask.getId(), | ||||||
|                         tasksMap.get(processingTask.getId()).size(),chaptIndex )); |                         tasksMap.get(processingTask.getId()).size(),chaptIndex )); | ||||||
| 
 | 
 | ||||||
| 
 |               //  if(taskIndex==tIndex+1){ | ||||||
|                 Intent broadcastIntent = new Intent(); |  | ||||||
|                 broadcastIntent.setAction("ServiceDownload.ChapterContent.finished"); |  | ||||||
|                 broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT); |  | ||||||
|                 broadcastIntent.putExtra("progress", processingTask.getFinishedChpats()); |  | ||||||
|                 broadcastIntent.putExtra("novelId", processingTask.getNovelId()); |  | ||||||
|                 sendBroadcast(broadcastIntent); |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|                 if( tasksMap.get(processingTask.getId()).size()-1 > chaptIndex){ |                         Intent broadcastIntent = new Intent(); | ||||||
|                     chaptIndex++; |                         broadcastIntent.setAction("ServiceDownload.ChapterContent.finished"); | ||||||
|  |                         broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT); | ||||||
|  |                         broadcastIntent.putExtra("progress", processingTask.getFinishedChpats()>processingTask.getTotalChapts() ?processingTask.getTotalChapts():processingTask.getFinishedChpats()); | ||||||
|  |                         broadcastIntent.putExtra("novelId", processingTask.getNovelId()); | ||||||
|  |                         broadcastIntent.putExtra("taskId", processingTask.getId()); | ||||||
|  |                         sendBroadcast(broadcastIntent); | ||||||
|  | 
 | ||||||
|  |                //   } | ||||||
|  | 
 | ||||||
|  |                 if( tasksMap.get(taskId).size()-1 > chaptIndex){ | ||||||
|  |                     if( downloadTasks.get(tIndex).getDownSatus() == DownloadTask.DownStatus.正在下载) { | ||||||
|  |                         chaptIndex++; | ||||||
|  |                     }else{ | ||||||
|  |                         return; | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|                 }else{ |                 }else{ | ||||||
|                     Log.d(TAG,String.format("%s task done ---- taskId :%s, chapter count %s,chaptIndex %s",TAG , processingTask.getId(), |                     Log.d(TAG,String.format("%s task done ---- taskId :%s, chapter count %s,chaptIndex %s",TAG , processingTask.getId(), | ||||||
|                             tasksMap.get(processingTask.getId()).size(),chaptIndex )); |                             tasksMap.get(processingTask.getId()).size(),chaptIndex )); | ||||||
|                       //章节全部处理完毕了 |                       //章节全部处理完毕了 | ||||||
|                         processingTask.setStatus(1); |  | ||||||
|                         processingTask.update(processingTask.getId()); |  | ||||||
| 
 | 
 | ||||||
|                         tasksMap.remove(processingTask.getId()); //会不会线程冲突? |                     if(taskId == processingTask.getId()) { | ||||||
|  |                         int abc = 1; | ||||||
|  |                         abc++; | ||||||
|  |                         if(tasksMap.get(taskId).size() == tasksMapDone.get(taskId).size()) { | ||||||
|  |                             processingTask.setStatus(1); | ||||||
|  |                             processingTask.update(processingTask.getId()); | ||||||
|  |                           //  tasksMap.remove(processingTask.getId()); //会不会线程冲突? | ||||||
|  |                         } | ||||||
| 
 | 
 | ||||||
|                         startTask(); | 
 | ||||||
|  |                     } | ||||||
|  |                   //startTask(); //auto start next task | ||||||
|  |                     return; | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 doDownloadContent(); |                 doDownloadContent(tIndex,chaptIndex); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|         } |         } | ||||||
|  | @ -176,22 +318,67 @@ public class ServiceDownload extends IntentService { | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |     private void stopTask(int taskId) { | ||||||
| 
 | 
 | ||||||
|  |         if(processingTask==null || processingTask.getId()==taskId) { | ||||||
|  |             //startTask();//to start next | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * 启动指定task | ||||||
|  |      * @param taskId | ||||||
|  |      */ | ||||||
|  |     private void startTask(int taskId) { | ||||||
|  |         if ( downloadTasks.size()==0){ | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         if(processingTask!=null) { | ||||||
|  |             processingTask.update(processingTask.getId()); | ||||||
|  |         } | ||||||
|  |         taskIndex=0; | ||||||
|  |         for(DownloadTask task : downloadTasks) { | ||||||
|  |             if(task.getId()==taskId) { | ||||||
|  |                 processingTask = task; | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |             taskIndex++; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         processingTask.setDownSatus(DownloadTask.DownStatus.正在下载); | ||||||
|  |         chaptIndex=0; | ||||||
|  |         doDownloadContent(taskIndex,chaptIndex); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * auto next task | ||||||
|  |      */ | ||||||
|     private void startTask() { |     private void startTask() { | ||||||
| 
 |        if ( downloadTasks.size()==0){ | ||||||
|  |            return; | ||||||
|  |        } | ||||||
|         if(processingTask!=null) { |         if(processingTask!=null) { | ||||||
|             processingTask.update(processingTask.getId()); |             processingTask.update(processingTask.getId()); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         Log.d(TAG,"ServiceDownload start task to download,index " +taskIndex); | ||||||
|  | 
 | ||||||
|         if(downloadTasks.size() <=taskIndex){ |         if(downloadTasks.size() <=taskIndex){ | ||||||
|  |             taskIndex=0; | ||||||
|             processingTask =null; |             processingTask =null; | ||||||
|             Log.d(TAG,"No task to download."); |          //   Log.d(TAG,"No task to download."); | ||||||
|             return; |            // return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         processingTask =    downloadTasks.get(taskIndex); |         processingTask =    downloadTasks.get(taskIndex); | ||||||
|  |       if(processingTask.getDownSatus()== DownloadTask.DownStatus.等待下载){ | ||||||
|  |             taskIndex++; | ||||||
|  |             startTask(); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         processingTask.setDownSatus(DownloadTask.DownStatus.正在下载); | ||||||
|         chaptIndex=0; |         chaptIndex=0; | ||||||
|         doDownloadContent(); |         doDownloadContent(taskIndex,chaptIndex); | ||||||
|         if(taskIndex < downloadTasks.size()-1){ |         if(taskIndex < downloadTasks.size()-1){ | ||||||
|             taskIndex++; |             taskIndex++; | ||||||
|         } |         } | ||||||
|  | @ -199,16 +386,20 @@ public class ServiceDownload extends IntentService { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|     void doDownloadContent(){ |     void doDownloadContent(int taskIndex,int chaptIndex){ | ||||||
| 
 |         Message mg = Message.obtain(); | ||||||
|         Log.d(TAG, String.format("ServiceDowload--- taskId: %s ",processingTask.getId())); |         mg.what =2; | ||||||
|  |         Bundle bundleData = new Bundle(); | ||||||
|  |         bundleData.putInt("tIndex", taskIndex); | ||||||
|  |         mg.setData(bundleData); | ||||||
|  |         Log.d(TAG, String.format("ServiceDownload--- taskId: %s ",processingTask.getId())); | ||||||
|         List<Chapter> chps = tasksMap.get(processingTask.getId()); |         List<Chapter> chps = tasksMap.get(processingTask.getId()); | ||||||
|         if(chps!=null && chps.size()>0) { |         if(chps!=null && chps.size()>0 && chps.size() >chaptIndex) { | ||||||
|             Chapter chapter = chps.get(chaptIndex); |             Chapter chapter = chps.get(chaptIndex); | ||||||
| 
 | 
 | ||||||
|             if (TextUtils.isEmpty(chapter.getChapterPath())) { |             if (TextUtils.isEmpty(chapter.getChapterPath())) { | ||||||
|                 try { |                 try { | ||||||
|                     ServiceDownload(chapter); |                     ServiceDownload(taskIndex,chapter); | ||||||
|                 } catch (JSONException e) { |                 } catch (JSONException e) { | ||||||
|                     e.printStackTrace(); |                     e.printStackTrace(); | ||||||
|                 } catch (InterruptedException e) { |                 } catch (InterruptedException e) { | ||||||
|  | @ -218,19 +409,19 @@ public class ServiceDownload extends IntentService { | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|             } else { |             } else { | ||||||
|                 handler.sendEmptyMessage(2); |                 handler.sendMessage(mg); | ||||||
|             } |             } | ||||||
|         }else{ |         }else{ | ||||||
|             handler.sendEmptyMessage(2); |             handler.sendMessage(mg); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|       void startNewTask(int taskId){ |       void startNewTask(DownloadTask dt){ | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|         DownloadTask dt = LitePal.find(DownloadTask.class,taskId); |  | ||||||
|         if(dt!=null){ |         if(dt!=null){ | ||||||
|             List<Chapter> chps = Chapter.getUnCachedChapters(dt.getNovelId(),dt.getDomain() ); |             List<Chapter> chps = Chapter.getUnCachedChapters(dt.getId()); | ||||||
|             if(chps==null || chps.size()==0){ |             if(chps==null || chps.size()==0){ | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|  | @ -243,16 +434,16 @@ public class ServiceDownload extends IntentService { | ||||||
| 
 | 
 | ||||||
|                 downloadTasks.add(dt); |                 downloadTasks.add(dt); | ||||||
| 
 | 
 | ||||||
|                 for(DownloadTask tmp: downloadTasks){ |               /*  for(DownloadTask tmp: downloadTasks){ | ||||||
|                     Log.d(TAG, String.format("test service task list : %s",tmp.getId())); |                     Log.d(TAG, String.format("test service task list : %s",tmp.getId())); | ||||||
|                 } |                 }*/ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|                 tasksMap.put(dt.getId(), chps); |                 tasksMap.put(dt.getId(), chps); | ||||||
|                 if(taskIndex==0) { |               /*  if(taskIndex==0) { | ||||||
|                     startTask(); |                     startTask(); | ||||||
|                   //  handler.sendEmptyMessage(1); |                   //  handler.sendEmptyMessage(1); | ||||||
|                 } |                 }*/ | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         /* |         /* | ||||||
|  | @ -268,21 +459,27 @@ public class ServiceDownload extends IntentService { | ||||||
| 
 | 
 | ||||||
|         */ |         */ | ||||||
|     } |     } | ||||||
|     private void ServiceDownload( Chapter chapter ) throws JSONException, InterruptedException { |     private void ServiceDownload(int taskIndex, Chapter chapter ) throws JSONException, InterruptedException { | ||||||
| 
 | 
 | ||||||
|  |         int taskID=  downloadTasks.get(taskIndex).getId() ; | ||||||
|         int msg =2; |         int msg =2; | ||||||
| 
 |         Message mg = Message.obtain(); | ||||||
|  |         mg.what =msg; | ||||||
|  |         Bundle bundleData = new Bundle(); | ||||||
|  |         bundleData.putInt("tIndex", taskIndex); | ||||||
|  |         mg.setData(bundleData); | ||||||
|         String url = chapter.getChapterUrl(); |         String url = chapter.getChapterUrl(); | ||||||
|         if( TextUtils.isEmpty( url)){ |         if( TextUtils.isEmpty( url)){ | ||||||
|             handler.sendEmptyMessage(msg); |           //  handler.sendEmptyMessage(msg); | ||||||
|  |             handler.sendMessage(mg); | ||||||
|             return ; |             return ; | ||||||
|         } |         } | ||||||
|         long startTime= new Date().getTime(); |         long startTime= new Date().getTime(); | ||||||
|         Log.d(TAG,String.format("ServiceDowload----start download %s from %s",   chapter.getChapterName()  ,url )); |         Log.d(TAG,String.format("ServiceDownload----start download %s from %s",   chapter.getChapterName()  ,url )); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|         //  Log.d( "ServiceDowload",String.format("ServiceDowload isDownloadChapt: %s",isDownloadChapt)); |         //  Log.d( "ServiceDownload",String.format("ServiceDownload isDownloadChapt: %s",isDownloadChapt)); | ||||||
|         JSONObject siteJson = new JSONObject(); |         JSONObject siteJson = new JSONObject(); | ||||||
|         siteJson.put("chapterContentRegex", siteRuleMap.get(chapter.getNovelId()).getChapterContentRegex()); |         siteJson.put("chapterContentRegex", siteRuleMap.get(chapter.getNovelId()).getChapterContentRegex()); | ||||||
|         siteJson.put("chapterContentDumpRegex",  siteRuleMap.get(chapter.getNovelId()).getChapterContentDumpRegex()); |         siteJson.put("chapterContentDumpRegex",  siteRuleMap.get(chapter.getNovelId()).getChapterContentDumpRegex()); | ||||||
|  | @ -290,10 +487,10 @@ public class ServiceDownload extends IntentService { | ||||||
|         HttpMethods.getOkClient().newCall(request).enqueue(new Callback() { |         HttpMethods.getOkClient().newCall(request).enqueue(new Callback() { | ||||||
|             @Override |             @Override | ||||||
|             public void onFailure(Call call, IOException e) { |             public void onFailure(Call call, IOException e) { | ||||||
|  |                 handler.sendMessage(mg); | ||||||
|  |              //   handler.sendEmptyMessage(msg); | ||||||
| 
 | 
 | ||||||
|                 handler.sendEmptyMessage(msg); |                 //  Log.d( "ServiceDownload",String.format("ServiceDownload fail, isDownloadChapt: %s",isDownloadChapt)); | ||||||
| 
 |  | ||||||
|                 //  Log.d( "ServiceDowload",String.format("ServiceDowload fail, isDownloadChapt: %s",isDownloadChapt)); |  | ||||||
|                 e.printStackTrace(); |                 e.printStackTrace(); | ||||||
|                 // throw new RuntimeException("Error during writing " + fileChapterName( index)); |                 // throw new RuntimeException("Error during writing " + fileChapterName( index)); | ||||||
|             } |             } | ||||||
|  | @ -303,12 +500,13 @@ public class ServiceDownload extends IntentService { | ||||||
|                 ResponseBody body = response.body(); |                 ResponseBody body = response.body(); | ||||||
|                 if (body != null ) { |                 if (body != null ) { | ||||||
|                     if(response.code()!=200){ |                     if(response.code()!=200){ | ||||||
|                         Log.d(TAG, "ServiceDowload----network failure returnCode " + response.code()); |                         Log.d(TAG, "ServiceDownload----network failure returnCode " + response.code()); | ||||||
|                         //  setDownloadFlag(true); |                         //  setDownloadFlag(true); | ||||||
|                         //  chaptDownStatus.put(index, BookUtil.DownloadStatus.failure); |                         //  chaptDownStatus.put(index, BookUtil.DownloadStatus.failure); | ||||||
|                         //   Log.d( "ServiceDowload",String.format("ServiceDowload error %s ,isDownloadChapt: %s",  response.code(),isDownloadChapt)); |                         //   Log.d( "ServiceDownload",String.format("ServiceDownload error %s ,isDownloadChapt: %s",  response.code(),isDownloadChapt)); | ||||||
|                         handler.sendEmptyMessage(msg); |                        // handler.sendEmptyMessage(msg); | ||||||
|                         return; |                         handler.sendMessage(mg); | ||||||
|  |                     return; | ||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|                     try { |                     try { | ||||||
|  | @ -322,7 +520,7 @@ public class ServiceDownload extends IntentService { | ||||||
|                         final OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(fileChapterName(chapter)), "utf-8");//"UTF-16LE"); // UTF-16LE 比 utf-8 文件小 |                         final OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(fileChapterName(chapter)), "utf-8");//"UTF-16LE"); // UTF-16LE 比 utf-8 文件小 | ||||||
|                         writer.write(buf); |                         writer.write(buf); | ||||||
|                         writer.close(); |                         writer.close(); | ||||||
|                         Log.d( "ServiceDowload",String.format("ServiceDowload file created:  %s",  file.getPath())); |                         Log.d( "ServiceDownload",String.format("ServiceDownload file created:  %s",  file.getPath())); | ||||||
|                         processingTask.setFinishedChpats(processingTask.getFinishedChpats()+1); |                         processingTask.setFinishedChpats(processingTask.getFinishedChpats()+1); | ||||||
|                         processingTask.update(processingTask.getId()); |                         processingTask.update(processingTask.getId()); | ||||||
|                         Thread.sleep(siteRuleMap.get(chapter.getNovelId()).getMiniInterval4AccessChapter()); |                         Thread.sleep(siteRuleMap.get(chapter.getNovelId()).getMiniInterval4AccessChapter()); | ||||||
|  | @ -340,11 +538,16 @@ public class ServiceDownload extends IntentService { | ||||||
| 
 | 
 | ||||||
|                     chapter.setChapterPath(fileChapterName(chapter)); |                     chapter.setChapterPath(fileChapterName(chapter)); | ||||||
|                     chapter.update(chapter.getId()); |                     chapter.update(chapter.getId()); | ||||||
|                     handler.sendEmptyMessage(msg); |                    if(! tasksMapDone.containsKey(taskID)){ | ||||||
|  |                        tasksMapDone.put(taskID,new ArrayList<Chapter>()); | ||||||
|  |                    } | ||||||
| 
 | 
 | ||||||
|  |                     tasksMapDone.get(taskID).add(chapter); | ||||||
|  | 
 | ||||||
|  |                     handler.sendMessage(mg); | ||||||
|                     //setDownloadFlag(true); |                     //setDownloadFlag(true); | ||||||
|                     //   chaptDownStatus.put(index, BookUtil.DownloadStatus.success); |                     //   chaptDownStatus.put(index, BookUtil.DownloadStatus.success); | ||||||
|                     Log.d(TAG,String.format("ServiceDowload---- finished download %s, cost time %s ,content path %s ",  chapter.getChapterName(),  new Date().getTime() -startTime ,chapter.getChapterPath()   )); |                     Log.d(TAG,String.format("ServiceDownload---- finished download %s, cost time %s ,content path %s ",  chapter.getChapterName(),  new Date().getTime() -startTime ,chapter.getChapterPath()   )); | ||||||
| 
 | 
 | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  | @ -370,10 +573,10 @@ public class ServiceDownload extends IntentService { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         long startTime = new Date().getTime(); |         long startTime = new Date().getTime(); | ||||||
|         Log.d(TAG, String.format("ServiceDowload----start download %s from %s", chapter.getChapterName(), url)); |         Log.d(TAG, String.format("ServiceDownload----start download %s from %s", chapter.getChapterName(), url)); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|         //  Log.d( "ServiceDowload",String.format("ServiceDowload isDownloadChapt: %s",isDownloadChapt)); |         //  Log.d( "ServiceDownload",String.format("ServiceDownload isDownloadChapt: %s",isDownloadChapt)); | ||||||
|         JSONObject siteJson = new JSONObject(); |         JSONObject siteJson = new JSONObject(); | ||||||
|         siteJson.put("chapterContentRegex", siteRuleMap.get(chapter.getNovelId()).getChapterContentRegex()); |         siteJson.put("chapterContentRegex", siteRuleMap.get(chapter.getNovelId()).getChapterContentRegex()); | ||||||
|         siteJson.put("chapterContentDumpRegex", siteRuleMap.get(chapter.getNovelId()).getChapterContentDumpRegex()); |         siteJson.put("chapterContentDumpRegex", siteRuleMap.get(chapter.getNovelId()).getChapterContentDumpRegex()); | ||||||
|  | @ -382,10 +585,10 @@ public class ServiceDownload extends IntentService { | ||||||
|         ResponseBody body = response.body(); |         ResponseBody body = response.body(); | ||||||
|         if (body != null) { |         if (body != null) { | ||||||
|             if (response.code() != 200) { |             if (response.code() != 200) { | ||||||
|                 Log.d(TAG, "ServiceDowload----network failure returnCode " + response.code()); |                 Log.d(TAG, "ServiceDownload----network failure returnCode " + response.code()); | ||||||
|                 //  setDownloadFlag(true); |                 //  setDownloadFlag(true); | ||||||
|                 //  chaptDownStatus.put(index, BookUtil.DownloadStatus.failure); |                 //  chaptDownStatus.put(index, BookUtil.DownloadStatus.failure); | ||||||
|                 //   Log.d( "ServiceDowload",String.format("ServiceDowload error %s ,isDownloadChapt: %s",  response.code(),isDownloadChapt)); |                 //   Log.d( "ServiceDownload",String.format("ServiceDownload error %s ,isDownloadChapt: %s",  response.code(),isDownloadChapt)); | ||||||
|                 handler.sendEmptyMessage(msg); |                 handler.sendEmptyMessage(msg); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|  | @ -401,7 +604,7 @@ public class ServiceDownload extends IntentService { | ||||||
|                 final OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(fileChapterName(chapter)), "utf-8");//"UTF-16LE"); // UTF-16LE 比 utf-8 文件小 |                 final OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(fileChapterName(chapter)), "utf-8");//"UTF-16LE"); // UTF-16LE 比 utf-8 文件小 | ||||||
|                 writer.write(buf); |                 writer.write(buf); | ||||||
|                 writer.close(); |                 writer.close(); | ||||||
|                 Log.d("ServiceDowload", String.format("ServiceDowload file created:  %s", file.getPath())); |                 Log.d("ServiceDownload", String.format("ServiceDownload file created:  %s", file.getPath())); | ||||||
|                 processingTask.setFinishedChpats(processingTask.getFinishedChpats() + 1); |                 processingTask.setFinishedChpats(processingTask.getFinishedChpats() + 1); | ||||||
|                 processingTask.update(processingTask.getId()); |                 processingTask.update(processingTask.getId()); | ||||||
|                 Thread.sleep(siteRuleMap.get(chapter.getNovelId()).getMiniInterval4AccessChapter()); |                 Thread.sleep(siteRuleMap.get(chapter.getNovelId()).getMiniInterval4AccessChapter()); | ||||||
|  | @ -422,7 +625,7 @@ public class ServiceDownload extends IntentService { | ||||||
| 
 | 
 | ||||||
|             //setDownloadFlag(true); |             //setDownloadFlag(true); | ||||||
|             //   chaptDownStatus.put(index, BookUtil.DownloadStatus.success); |             //   chaptDownStatus.put(index, BookUtil.DownloadStatus.success); | ||||||
|             Log.d(TAG, String.format("ServiceDowload---- finished download %s, cost time %s ,content path %s ", chapter.getChapterName(), new Date().getTime() - startTime, chapter.getChapterPath())); |             Log.d(TAG, String.format("ServiceDownload---- finished download %s, cost time %s ,content path %s ", chapter.getChapterName(), new Date().getTime() - startTime, chapter.getChapterPath())); | ||||||
| 
 | 
 | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,500 @@ | ||||||
|  | package com.novelbook.android.service; | ||||||
|  | 
 | ||||||
|  | import android.app.IntentService; | ||||||
|  | import android.content.Intent; | ||||||
|  | import android.os.Handler; | ||||||
|  | import android.os.Message; | ||||||
|  | import android.text.TextUtils; | ||||||
|  | import android.util.Log; | ||||||
|  | 
 | ||||||
|  | import com.novelbook.android.db.Chapter; | ||||||
|  | import com.novelbook.android.db.DownloadTask; | ||||||
|  | import com.novelbook.android.db.SiteRule; | ||||||
|  | import com.novelbook.android.netutils.HttpMethods; | ||||||
|  | import com.novelbook.android.utils.BookUtil; | ||||||
|  | import com.novelbook.android.utils.NovelParseUtil; | ||||||
|  | 
 | ||||||
|  | import org.json.JSONException; | ||||||
|  | import org.json.JSONObject; | ||||||
|  | import org.litepal.LitePal; | ||||||
|  | 
 | ||||||
|  | import java.io.File; | ||||||
|  | import java.io.FileOutputStream; | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.io.OutputStreamWriter; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.Date; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.concurrent.ConcurrentHashMap; | ||||||
|  | 
 | ||||||
|  | import okhttp3.Call; | ||||||
|  | import okhttp3.Callback; | ||||||
|  | import okhttp3.Request; | ||||||
|  | import okhttp3.Response; | ||||||
|  | import okhttp3.ResponseBody; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | public class ServiceDownloadIntent extends IntentService { | ||||||
|  |     private static final String TAG ="ServiceDownload" ; | ||||||
|  | 
 | ||||||
|  |     private   final String storagePath = BookUtil.storagePath; | ||||||
|  |     private   final String cachedPath = BookUtil.cachedPath; | ||||||
|  |     private   final String chapterPath = BookUtil.chapterPath; | ||||||
|  | 
 | ||||||
|  |     public final String EXTR_TASKID ="taskId"; | ||||||
|  |     public final String EXTR_OFFSET ="offset"; //多线程下载,每个线程取章节偏移数量 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |    // public ServiceDownload(String name) { | ||||||
|  |   //      super(name); | ||||||
|  |   //  } | ||||||
|  |     public ServiceDownloadIntent() { | ||||||
|  |         super("ServiceDownload"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |      private Map<Integer,SiteRule>  siteRuleMap = new HashMap<Integer,SiteRule>()  ;  // key = novelId | ||||||
|  |      private DownloadTask processingTask  ; | ||||||
|  |      private int taskIndex=0; | ||||||
|  |      private int chaptIndex=0; | ||||||
|  | 
 | ||||||
|  |     private Map<Integer ,List<Chapter>> tasksMap = new  ConcurrentHashMap<Integer, List<Chapter>>();// key = taskId | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public void onCreate() { | ||||||
|  |         super.onCreate(); | ||||||
|  |         Log.d(TAG,"test service onCreate..."); | ||||||
|  | 
 | ||||||
|  |         /* | ||||||
|  |         downloadTasks =LitePal.where("status = ?","0").find(DownloadTask.class); | ||||||
|  |         for(DownloadTask dt :downloadTasks){ | ||||||
|  |             List<Chapter> chps =Chapter.getUnCachedChapters(dt.getNovelId(),dt.getDomain()); | ||||||
|  |             if(chps.size()>0) { | ||||||
|  |                 SiteRule sr = SiteRule.getSiteRuleByDomain(dt.getDomain()); | ||||||
|  |                 siteRuleMap.put(dt.getNovelId(), sr); | ||||||
|  |                 tasksMap.put(dt.getId(), chps); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         for(DownloadTask tmp: downloadTasks){ | ||||||
|  |             Log.d(TAG, String.format("test service task list : %s",tmp.getId())); | ||||||
|  |         } | ||||||
|  |         */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     @Override | ||||||
|  |     public void onStart(Intent intent, int startId) { | ||||||
|  |         super.onStart(intent, startId); | ||||||
|  |         Log.d(TAG,"test service onStart"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public int onStartCommand(Intent intent, int flags, int startId) { | ||||||
|  |         Log.d(TAG,"test service onStartCommand"); | ||||||
|  |         return super.onStartCommand(intent, flags, startId); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public void onDestroy() { | ||||||
|  |         Log.d(TAG,"test service onDestroy"); | ||||||
|  |         super.onDestroy(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     private List<DownloadTask> downloadTasks = new ArrayList<DownloadTask>(); | ||||||
|  | 
 | ||||||
|  |     int cancelId =0; | ||||||
|  |     @Override | ||||||
|  |     protected void onHandleIntent( Intent intent) { | ||||||
|  |         Log.d(TAG,"test service onHandleIntent...begin"); | ||||||
|  | 
 | ||||||
|  |         String key ="taskId"; | ||||||
|  |         int taskId =0; | ||||||
|  | 
 | ||||||
|  |         if(intent.hasExtra(key)){ | ||||||
|  |             taskId=	intent.getExtras().getInt(key); | ||||||
|  |             DownloadTask dt = LitePal.find(DownloadTask.class,taskId); | ||||||
|  | 
 | ||||||
|  |             if(intent.hasExtra("start")){ | ||||||
|  |                 if(!intent.getBooleanExtra("start",true)){ | ||||||
|  |                     cancelId = taskId; | ||||||
|  |                     stopTask(taskId); | ||||||
|  |                 }else{ | ||||||
|  |                     startNewTask(dt); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  |         else{ | ||||||
|  |             if(downloadTasks.size()==0) { | ||||||
|  |                 List<DownloadTask> tmp = LitePal.findAll(DownloadTask.class); | ||||||
|  |                 taskIndex=0; | ||||||
|  |                 for(DownloadTask dt :tmp) { | ||||||
|  |                     startNewTask(dt); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |           /* | ||||||
|  |              if(processingTask==null) { | ||||||
|  |                 startTask(); | ||||||
|  |             }*/ | ||||||
|  |         } | ||||||
|  |         Log.d(TAG,"test service onHandleIntent...over"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private void stopTask(int taskId) { | ||||||
|  |         for(DownloadTask dt : downloadTasks){ | ||||||
|  |             if(dt.getId() == taskId){ | ||||||
|  |                 dt.setDownSatus(DownloadTask.DownStatus.等待下载); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         startTask(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     Handler handler = new Handler()  { | ||||||
|  |         @Override | ||||||
|  |         public void handleMessage(Message msg) { | ||||||
|  |             if(msg.what ==1){ | ||||||
|  |                 startTask(); | ||||||
|  |             }else if(msg.what==2){ | ||||||
|  | 
 | ||||||
|  |                 if( downloadTasks.get(taskIndex).getDownSatus() == DownloadTask.DownStatus.等待下载){ | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                 if(tasksMap.get(processingTask.getId())==null){ | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                 Log.d(TAG,String.format("%s start new chapt download---- taskId :%s, chapter count %s,chaptIndex %s",TAG | ||||||
|  |                         , processingTask.getId(), | ||||||
|  |                         tasksMap.get(processingTask.getId()).size(),chaptIndex )); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                 Intent broadcastIntent = new Intent(); | ||||||
|  |                 broadcastIntent.setAction("ServiceDownload.ChapterContent.finished"); | ||||||
|  |                 broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT); | ||||||
|  |                 broadcastIntent.putExtra("progress", processingTask.getFinishedChpats()); | ||||||
|  |                 broadcastIntent.putExtra("novelId", processingTask.getNovelId()); | ||||||
|  |                 broadcastIntent.putExtra("taskId", processingTask.getId()); | ||||||
|  |                 sendBroadcast(broadcastIntent); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                 if( tasksMap.get(processingTask.getId()).size()-1 > chaptIndex){ | ||||||
|  | 
 | ||||||
|  |                     chaptIndex++; | ||||||
|  | 
 | ||||||
|  |                 }else{ | ||||||
|  |                     Log.d(TAG,String.format("%s task done ---- taskId :%s, chapter count %s,chaptIndex %s",TAG , processingTask.getId(), | ||||||
|  |                             tasksMap.get(processingTask.getId()).size(),chaptIndex )); | ||||||
|  |                       //章节全部处理完毕了 | ||||||
|  |                         processingTask.setStatus(1); | ||||||
|  |                         processingTask.update(processingTask.getId()); | ||||||
|  | 
 | ||||||
|  |                         tasksMap.remove(processingTask.getId()); //会不会线程冲突? | ||||||
|  | 
 | ||||||
|  |                         startTask(); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 doDownloadContent(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     private void startTask() { | ||||||
|  | 
 | ||||||
|  |         if(processingTask!=null) { | ||||||
|  |             processingTask.update(processingTask.getId()); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         if(downloadTasks.size() <=taskIndex){ | ||||||
|  |             processingTask =null; | ||||||
|  |             Log.d(TAG,"No task to download."); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         processingTask =    downloadTasks.get(taskIndex); | ||||||
|  |         if(processingTask.getDownSatus()== DownloadTask.DownStatus.等待下载){ | ||||||
|  |             taskIndex++; | ||||||
|  |             startTask(); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         processingTask.setDownSatus(DownloadTask.DownStatus.正在下载); | ||||||
|  |         chaptIndex=0; | ||||||
|  |         doDownloadContent(); | ||||||
|  |         if(taskIndex < downloadTasks.size()-1){ | ||||||
|  |             taskIndex++; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     void doDownloadContent(){ | ||||||
|  | 
 | ||||||
|  |         Log.d(TAG, String.format("ServiceDowload--- taskId: %s ",processingTask.getId())); | ||||||
|  |         List<Chapter> chps = tasksMap.get(processingTask.getId()); | ||||||
|  |         if(chps!=null && chps.size()>0) { | ||||||
|  |             Chapter chapter = chps.get(chaptIndex); | ||||||
|  | 
 | ||||||
|  |             if (TextUtils.isEmpty(chapter.getChapterPath())) { | ||||||
|  |                 try { | ||||||
|  |                     ServiceDownload(chapter); | ||||||
|  |                 } catch (JSONException e) { | ||||||
|  |                     e.printStackTrace(); | ||||||
|  |                 } catch (InterruptedException e) { | ||||||
|  |                     e.printStackTrace(); | ||||||
|  |                // } catch (IOException e) { | ||||||
|  |               //      e.printStackTrace(); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |             } else { | ||||||
|  |                 handler.sendEmptyMessage(2); | ||||||
|  |             } | ||||||
|  |         }else{ | ||||||
|  |             handler.sendEmptyMessage(2); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |       void startNewTask(DownloadTask dt){ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         if(dt!=null){ | ||||||
|  |             List<Chapter> chps = Chapter.getUnCachedChapters(dt.getId() ); | ||||||
|  |             if(chps==null || chps.size()==0){ | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |             SiteRule siteRule = SiteRule. getSiteRuleByDomain(dt.getDomain()); | ||||||
|  |             if(siteRule==null){ | ||||||
|  |                 //to do get siterule from web | ||||||
|  |                 Log.d(TAG, String.format("没找到site rule: %s",dt.getDomain())); | ||||||
|  |             }else { | ||||||
|  |                 siteRuleMap.put(dt.getNovelId(),siteRule); | ||||||
|  | 
 | ||||||
|  |                 downloadTasks.add(dt); | ||||||
|  | 
 | ||||||
|  |                 for(DownloadTask tmp: downloadTasks){ | ||||||
|  |                     Log.d(TAG, String.format("test service task list : %s",tmp.getId())); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                 tasksMap.put(dt.getId(), chps); | ||||||
|  |                 if(taskIndex==0) { | ||||||
|  |                     startTask(); | ||||||
|  |                   //  handler.sendEmptyMessage(1); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         /* | ||||||
|  |         new Thread() { | ||||||
|  | 
 | ||||||
|  |             @Override | ||||||
|  |             public void run() { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  |         }.start(); | ||||||
|  | 
 | ||||||
|  |         */ | ||||||
|  |     } | ||||||
|  |     private void ServiceDownload( Chapter chapter ) throws JSONException, InterruptedException { | ||||||
|  | 
 | ||||||
|  |         int msg =2; | ||||||
|  | 
 | ||||||
|  |         String url = chapter.getChapterUrl(); | ||||||
|  |         if( TextUtils.isEmpty( url)){ | ||||||
|  |             handler.sendEmptyMessage(msg); | ||||||
|  |             return ; | ||||||
|  |         } | ||||||
|  |         long startTime= new Date().getTime(); | ||||||
|  |         Log.d(TAG,String.format("ServiceDowload----start download %s from %s",   chapter.getChapterName()  ,url )); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         //  Log.d( "ServiceDowload",String.format("ServiceDowload isDownloadChapt: %s",isDownloadChapt)); | ||||||
|  |         JSONObject siteJson = new JSONObject(); | ||||||
|  |         siteJson.put("chapterContentRegex", siteRuleMap.get(chapter.getNovelId()).getChapterContentRegex()); | ||||||
|  |         siteJson.put("chapterContentDumpRegex",  siteRuleMap.get(chapter.getNovelId()).getChapterContentDumpRegex()); | ||||||
|  |         Request request = getTagRequest(url); | ||||||
|  |         HttpMethods.getOkClient().newCall(request).enqueue(new Callback() { | ||||||
|  |             @Override | ||||||
|  |             public void onFailure(Call call, IOException e) { | ||||||
|  | 
 | ||||||
|  |                 handler.sendEmptyMessage(msg); | ||||||
|  | 
 | ||||||
|  |                 //  Log.d( "ServiceDowload",String.format("ServiceDowload fail, isDownloadChapt: %s",isDownloadChapt)); | ||||||
|  |                 e.printStackTrace(); | ||||||
|  |                 // throw new RuntimeException("Error during writing " + fileChapterName( index)); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             @Override | ||||||
|  |             public void onResponse(Call call, Response response){ | ||||||
|  |                 ResponseBody body = response.body(); | ||||||
|  |                 if (body != null ) { | ||||||
|  |                     if(response.code()!=200){ | ||||||
|  |                         Log.d(TAG, "ServiceDowload----network failure returnCode " + response.code()); | ||||||
|  |                         //  setDownloadFlag(true); | ||||||
|  |                         //  chaptDownStatus.put(index, BookUtil.DownloadStatus.failure); | ||||||
|  |                         //   Log.d( "ServiceDowload",String.format("ServiceDowload error %s ,isDownloadChapt: %s",  response.code(),isDownloadChapt)); | ||||||
|  |                         handler.sendEmptyMessage(msg); | ||||||
|  |                         return; | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                     try { | ||||||
|  |                         String bodyStr = body.string(); | ||||||
|  |                         String title = chapter.getChapterName(); | ||||||
|  |                         String chapterContent = title+ "\n" + NovelParseUtil.getChapterContent(bodyStr, siteJson); | ||||||
|  |                         char[] buf = chapterContent.toCharArray(); | ||||||
|  |                         File file = new File(fileChapterName(chapter)); | ||||||
|  |                         file.createNewFile(); | ||||||
|  | 
 | ||||||
|  |                         final OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(fileChapterName(chapter)), "utf-8");//"UTF-16LE"); // UTF-16LE 比 utf-8 文件小 | ||||||
|  |                         writer.write(buf); | ||||||
|  |                         writer.close(); | ||||||
|  |                         Log.d( "ServiceDowload",String.format("ServiceDowload file created:  %s",  file.getPath())); | ||||||
|  |                         processingTask.setFinishedChpats(processingTask.getFinishedChpats()+1); | ||||||
|  |                         processingTask.update(processingTask.getId()); | ||||||
|  |                         Thread.sleep(siteRuleMap.get(chapter.getNovelId()).getMiniInterval4AccessChapter()); | ||||||
|  |                         //  setDownloadFlag(true); | ||||||
|  |                     } catch (IOException | JSONException | InterruptedException e) { | ||||||
|  |                         e.printStackTrace(); | ||||||
|  |                         //  throw new RuntimeException("Error during writing " + fileChapterName( index)); | ||||||
|  |                     } | ||||||
|  |                     finally { | ||||||
|  |                         body.close(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                         //  setDownloadFlag(true); | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                     chapter.setChapterPath(fileChapterName(chapter)); | ||||||
|  |                     chapter.update(chapter.getId()); | ||||||
|  |                     handler.sendEmptyMessage(msg); | ||||||
|  | 
 | ||||||
|  |                     //setDownloadFlag(true); | ||||||
|  |                     //   chaptDownStatus.put(index, BookUtil.DownloadStatus.success); | ||||||
|  |                     Log.d(TAG,String.format("ServiceDowload---- finished download %s, cost time %s ,content path %s ",  chapter.getChapterName(),  new Date().getTime() -startTime ,chapter.getChapterPath()   )); | ||||||
|  | 
 | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * 直接 | ||||||
|  |      * @param chapter | ||||||
|  |      * @throws JSONException | ||||||
|  |      * @throws InterruptedException | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     private void ServiceDownload2( Chapter chapter ) throws IOException, JSONException, InterruptedException { | ||||||
|  | 
 | ||||||
|  |         int msg = 2; | ||||||
|  | 
 | ||||||
|  |         String url = chapter.getChapterUrl(); | ||||||
|  |         if (TextUtils.isEmpty(url)) { | ||||||
|  |             handler.sendEmptyMessage(msg); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         long startTime = new Date().getTime(); | ||||||
|  |         Log.d(TAG, String.format("ServiceDowload----start download %s from %s", chapter.getChapterName(), url)); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         //  Log.d( "ServiceDowload",String.format("ServiceDowload isDownloadChapt: %s",isDownloadChapt)); | ||||||
|  |         JSONObject siteJson = new JSONObject(); | ||||||
|  |         siteJson.put("chapterContentRegex", siteRuleMap.get(chapter.getNovelId()).getChapterContentRegex()); | ||||||
|  |         siteJson.put("chapterContentDumpRegex", siteRuleMap.get(chapter.getNovelId()).getChapterContentDumpRegex()); | ||||||
|  |         Request request = getTagRequest(url); | ||||||
|  |         Response response = HttpMethods.getOkClient().newCall(request).execute(); | ||||||
|  |         ResponseBody body = response.body(); | ||||||
|  |         if (body != null) { | ||||||
|  |             if (response.code() != 200) { | ||||||
|  |                 Log.d(TAG, "ServiceDowload----network failure returnCode " + response.code()); | ||||||
|  |                 //  setDownloadFlag(true); | ||||||
|  |                 //  chaptDownStatus.put(index, BookUtil.DownloadStatus.failure); | ||||||
|  |                 //   Log.d( "ServiceDowload",String.format("ServiceDowload error %s ,isDownloadChapt: %s",  response.code(),isDownloadChapt)); | ||||||
|  |                 handler.sendEmptyMessage(msg); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             try { | ||||||
|  |                 String bodyStr = body.string(); | ||||||
|  |                 String title = chapter.getChapterName(); | ||||||
|  |                 String chapterContent = title + "\n" + NovelParseUtil.getChapterContent(bodyStr, siteJson); | ||||||
|  |                 char[] buf = chapterContent.toCharArray(); | ||||||
|  |                 File file = new File(fileChapterName(chapter)); | ||||||
|  |                 file.createNewFile(); | ||||||
|  | 
 | ||||||
|  |                 final OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(fileChapterName(chapter)), "utf-8");//"UTF-16LE"); // UTF-16LE 比 utf-8 文件小 | ||||||
|  |                 writer.write(buf); | ||||||
|  |                 writer.close(); | ||||||
|  |                 Log.d("ServiceDowload", String.format("ServiceDowload file created:  %s", file.getPath())); | ||||||
|  |                 processingTask.setFinishedChpats(processingTask.getFinishedChpats() + 1); | ||||||
|  |                 processingTask.update(processingTask.getId()); | ||||||
|  |                 Thread.sleep(siteRuleMap.get(chapter.getNovelId()).getMiniInterval4AccessChapter()); | ||||||
|  |                 //  setDownloadFlag(true); | ||||||
|  |             } catch (IOException | JSONException | InterruptedException e) { | ||||||
|  |                 e.printStackTrace(); | ||||||
|  |                 //  throw new RuntimeException("Error during writing " + fileChapterName( index)); | ||||||
|  |             } finally { | ||||||
|  |                 body.close(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                 //  setDownloadFlag(true); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             chapter.setChapterPath(fileChapterName(chapter)); | ||||||
|  |             chapter.update(chapter.getId()); | ||||||
|  |             handler.sendEmptyMessage(msg); | ||||||
|  | 
 | ||||||
|  |             //setDownloadFlag(true); | ||||||
|  |             //   chaptDownStatus.put(index, BookUtil.DownloadStatus.success); | ||||||
|  |             Log.d(TAG, String.format("ServiceDowload---- finished download %s, cost time %s ,content path %s ", chapter.getChapterName(), new Date().getTime() - startTime, chapter.getChapterPath())); | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  |     protected String fileChapterName(Chapter chapter ) { | ||||||
|  |             return  getChapterPath(chapter.getNovelId()) +chapter.getDomain()+"/"+ chapter.getIndex() ; | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     String getChapterPath(int novelId){ | ||||||
|  |         File file = new File(chapterPath +novelId); | ||||||
|  |         if(!file.exists()){ | ||||||
|  |             file.mkdir(); | ||||||
|  |         } | ||||||
|  |         return  chapterPath +novelId+"/"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private Request getTagRequest(String url) { | ||||||
|  |         return new  Request.Builder() | ||||||
|  |                 .tag(processingTask.getNovelId()) //标记 | ||||||
|  |                 .url(url) | ||||||
|  |                 // .header("User-Agent", "OkHttp Example") | ||||||
|  |                 .build(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -248,6 +248,7 @@ public class BookUtil { | ||||||
|             file.mkdir(); |             file.mkdir(); | ||||||
|         } |         } | ||||||
|         mNovel.setDomain(mSite.getDomain()); |         mNovel.setDomain(mSite.getDomain()); | ||||||
|  |         mNovel.setDomainName(mSite.getName()); | ||||||
|         mNovel.setMuluUrl(mSite.getMuluUrl()); |         mNovel.setMuluUrl(mSite.getMuluUrl()); | ||||||
|         mNovel.update(mNovel.getId()); |         mNovel.update(mNovel.getId()); | ||||||
|     } |     } | ||||||
|  | @ -818,7 +819,7 @@ int muluRetryCount =0; | ||||||
|                         if (!st.getDomain().equals(mSite.getDomain())) { |                         if (!st.getDomain().equals(mSite.getDomain())) { | ||||||
|                             //mSite = st; |                             //mSite = st; | ||||||
|                             mNovel.setDomain(st.getDomain()); |                             mNovel.setDomain(st.getDomain()); | ||||||
| 
 |                             mNovel.setDomainName(mSite.getName()); | ||||||
|                             bundleData.putString("siteName", st.getName()); |                             bundleData.putString("siteName", st.getName()); | ||||||
|                             msg.setData(bundleData); |                             msg.setData(bundleData); | ||||||
|                             break; |                             break; | ||||||
|  |  | ||||||
|  | @ -0,0 +1,35 @@ | ||||||
|  | <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||||
|  |     xmlns:tools="http://schemas.android.com/tools" | ||||||
|  |     android:id="@+id/main_content" | ||||||
|  |     android:layout_width="match_parent" | ||||||
|  |     android:layout_height="match_parent" | ||||||
|  |     android:fitsSystemWindows="true" | ||||||
|  |     android:clipToPadding="true" | ||||||
|  |     tools:context=".Activity_cache"> | ||||||
|  | 
 | ||||||
|  |     <android.support.design.widget.AppBarLayout | ||||||
|  |         android:id="@+id/appbar" | ||||||
|  |         style="@style/barLayout"> | ||||||
|  | 
 | ||||||
|  |         <android.support.v7.widget.Toolbar | ||||||
|  |             android:id="@+id/toolbar" | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:layout_height="@dimen/toolbarHeight" | ||||||
|  |             android:background="?attr/colorPrimary" | ||||||
|  |             app:popupTheme="@style/ToolBarTheme.PopupOverlay"> | ||||||
|  | 
 | ||||||
|  |         </android.support.v7.widget.Toolbar> | ||||||
|  | 
 | ||||||
|  |     </android.support.design.widget.AppBarLayout> | ||||||
|  | 
 | ||||||
|  |     <android.support.v7.widget.RecyclerView | ||||||
|  |         android:id="@+id/recycleView" | ||||||
|  |         style="@style/llOutside" | ||||||
|  |         android:layout_marginTop="50dp" | ||||||
|  |         android:divider="@color/list_item_divider" | ||||||
|  |         > | ||||||
|  |     </android.support.v7.widget.RecyclerView> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | </android.support.design.widget.CoordinatorLayout> | ||||||
|  | @ -17,36 +17,37 @@ | ||||||
|         tools:ignore="UnusedAttribute"> |         tools:ignore="UnusedAttribute"> | ||||||
| 
 | 
 | ||||||
|         <LinearLayout |         <LinearLayout | ||||||
|             android:clickable="true" |  | ||||||
|             android:id="@+id/llBookdetail" |             android:id="@+id/llBookdetail" | ||||||
|             android:layout_width="match_parent" |             android:layout_width="match_parent" | ||||||
|             android:layout_height="100dp" |             android:layout_height="110dp" | ||||||
|             android:background="@color/white" |  | ||||||
|             android:layout_alignParentBottom="true" |             android:layout_alignParentBottom="true" | ||||||
|             android:paddingStart="100dp" |             android:background="@color/white" | ||||||
|             android:paddingLeft="120dp" |             android:clickable="true" | ||||||
|             android:orientation="horizontal" |             android:orientation="horizontal" | ||||||
|             > |             android:paddingStart="105dp" | ||||||
|  |             android:paddingLeft="120dp"> | ||||||
| 
 | 
 | ||||||
|             <LinearLayout |             <LinearLayout | ||||||
|                 android:layout_width="match_parent" |                 android:layout_width="match_parent" | ||||||
|                 android:layout_height="wrap_content" |                 android:layout_height="wrap_content" | ||||||
|                 android:layout_gravity="center_vertical" | 
 | ||||||
|                 android:paddingStart="15dp" |                 android:layout_gravity="top" | ||||||
|                 android:paddingRight="10dp" |  | ||||||
|                 android:layout_weight="1" |                 android:layout_weight="1" | ||||||
|                 android:background="@drawable/item_selector" |                 android:background="@drawable/item_selector" | ||||||
|                 android:orientation="vertical"> |                 android:orientation="vertical" | ||||||
|  |                 android:paddingStart="15dp" | ||||||
|  |                 android:paddingRight="10dp" | ||||||
|  |                 android:paddingTop="5dp"> | ||||||
| 
 | 
 | ||||||
|                 <TextView |                 <TextView | ||||||
|                     android:id="@+id/bdTitle" |                     android:id="@+id/bdTitle" | ||||||
|                     android:layout_width="wrap_content" |                     android:layout_width="wrap_content" | ||||||
|                     android:layout_height="wrap_content" |                     android:layout_height="wrap_content" | ||||||
|  |                     android:ellipsize="marquee" | ||||||
|                     android:text="射雕英雄传" |                     android:text="射雕英雄传" | ||||||
|                     android:textColor="@color/colorPrimary" |                     android:textColor="@color/colorPrimary" | ||||||
|                     android:textSize="16sp" |                     android:textSize="16sp" | ||||||
|                     android:textStyle="bold" |                     android:textStyle="bold" | ||||||
|                     android:ellipsize="marquee" |  | ||||||
|                     tools:ignore="HardcodedText,TextViewEdits" /> |                     tools:ignore="HardcodedText,TextViewEdits" /> | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -54,21 +55,21 @@ | ||||||
|                     android:id="@+id/tvAuthor" |                     android:id="@+id/tvAuthor" | ||||||
|                     android:layout_width="wrap_content" |                     android:layout_width="wrap_content" | ||||||
|                     android:layout_height="wrap_content" |                     android:layout_height="wrap_content" | ||||||
|                     android:visibility="visible" |  | ||||||
|                     android:text="金庸" |                     android:text="金庸" | ||||||
|  |                     android:visibility="visible" | ||||||
|                     tools:ignore="HardcodedText" /> |                     tools:ignore="HardcodedText" /> | ||||||
| 
 | 
 | ||||||
|                 <TextView |                 <TextView | ||||||
|                 android:layout_marginTop="2dp" |                     android:id="@+id/txtLatestCate" | ||||||
|                 android:id="@+id/txtLatestCate" |                     style="@style/TextViewDesc" | ||||||
|                 style="@style/TextViewDesc" |                     android:layout_width="wrap_content" | ||||||
|                 android:layout_width="wrap_content" |                     android:layout_height="wrap_content" | ||||||
|                 android:layout_height="wrap_content" |                     android:layout_marginTop="2dp" | ||||||
|                 android:lines="1" |                     android:ellipsize="end" | ||||||
|                 android:ellipsize="end" |                     android:lines="1" | ||||||
|                 android:text="" |                     android:text="" | ||||||
| 
 | 
 | ||||||
|                 /> |                     /> | ||||||
| 
 | 
 | ||||||
|                 <TextView |                 <TextView | ||||||
|                     android:id="@+id/txtLatestUpdate" |                     android:id="@+id/txtLatestUpdate" | ||||||
|  | @ -89,11 +90,11 @@ | ||||||
|         <android.support.v7.widget.CardView |         <android.support.v7.widget.CardView | ||||||
|             android:id="@+id/cardView" |             android:id="@+id/cardView" | ||||||
|             android:layout_width="80dp" |             android:layout_width="80dp" | ||||||
|             android:layout_height="130dp" |             android:layout_height="100dp" | ||||||
|             android:layout_marginEnd="14dp" |  | ||||||
|             android:layout_marginRight="14dp" |  | ||||||
|             android:layout_marginStart="20dp" |             android:layout_marginStart="20dp" | ||||||
|             android:layout_marginLeft="20dp" |             android:layout_marginLeft="20dp" | ||||||
|  |             android:layout_marginEnd="14dp" | ||||||
|  |             android:layout_marginRight="14dp" | ||||||
|             android:layout_marginBottom="5dp" |             android:layout_marginBottom="5dp" | ||||||
|             app:cardBackgroundColor="@color/white" |             app:cardBackgroundColor="@color/white" | ||||||
|             app:cardCornerRadius="6dp" |             app:cardCornerRadius="6dp" | ||||||
|  |  | ||||||
|  | @ -0,0 +1,96 @@ | ||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |     android:orientation="horizontal" | ||||||
|  |     android:layout_width="match_parent" | ||||||
|  |     android:layout_height="80dp" | ||||||
|  |     android:gravity="center" | ||||||
|  |     android:background="@drawable/item_selector" | ||||||
|  |     android:clickable="true" | ||||||
|  |     android:paddingStart="10dp" | ||||||
|  |     android:layout_weight="1"> | ||||||
|  | 
 | ||||||
|  |     <LinearLayout | ||||||
|  |         android:orientation="vertical" | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="match_parent" | ||||||
|  |         android:gravity="center" | ||||||
|  | 
 | ||||||
|  |         android:layout_weight="1"> | ||||||
|  |         <LinearLayout | ||||||
|  |             android:layout_marginTop="5dp" | ||||||
|  |             android:orientation="horizontal" | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:paddingRight="10dp" | ||||||
|  |             android:layout_height="wrap_content"> | ||||||
|  |         <TextView | ||||||
|  |             android:id="@+id/tvTitle" | ||||||
|  |          style="@style/TextViewNovelTitle" | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:layout_height="20dp" | ||||||
|  |             android:layout_gravity="left" | ||||||
|  |             android:text="射雕英雄传" | ||||||
|  |             android:layout_weight="1" | ||||||
|  |             android:textColor="@color/blacktitle" /> | ||||||
|  |             <TextView | ||||||
|  |                 android:id="@+id/tvStatus" | ||||||
|  |                 android:layout_marginLeft="5dp" | ||||||
|  |                 android:layout_width="wrap_content" | ||||||
|  |                 android:layout_height="wrap_content" | ||||||
|  |                 android:gravity="right" | ||||||
|  |                 android:textSize="12sp" | ||||||
|  |                 android:text="未知" | ||||||
|  |                 android:textColor="@color/grey" /> | ||||||
|  | 
 | ||||||
|  |         </LinearLayout> | ||||||
|  |         <LinearLayout | ||||||
|  |         android:layout_marginTop="5dp" | ||||||
|  |         android:orientation="horizontal" | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |             android:paddingRight="10dp" | ||||||
|  |         > | ||||||
|  |         <TextView | ||||||
|  |             android:id="@+id/tvSource" | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:layout_height="wrap_content" | ||||||
|  |             android:text="-/-" | ||||||
|  |             android:layout_weight="1" | ||||||
|  |             android:textSize="12sp" | ||||||
|  |             android:textColor="@color/blacktitle" /> | ||||||
|  | 
 | ||||||
|  |             <TextView | ||||||
|  |                 android:id="@+id/tvProgress" | ||||||
|  |                 android:layout_width="wrap_content" | ||||||
|  |                 android:layout_height="20dp" | ||||||
|  |                 android:textSize="12sp" | ||||||
|  |                 android:gravity="right" | ||||||
|  |                 android:layout_marginStart="50dp" | ||||||
|  |                 android:text="未知" | ||||||
|  |                 android:textColor="@color/grey" /> | ||||||
|  | 
 | ||||||
|  |     </LinearLayout> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         <ProgressBar android:id="@+id/barProgress" | ||||||
|  |             android:layout_width="fill_parent" | ||||||
|  |             android:layout_height="8dp" | ||||||
|  |             android:max="100" | ||||||
|  |             android:paddingTop="5dp" | ||||||
|  |            style="@android:style/Widget.ProgressBar.Horizontal" | ||||||
|  | 
 | ||||||
|  |             /> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     </LinearLayout> | ||||||
|  | 
 | ||||||
|  |     <ImageView | ||||||
|  |         android:clickable="true" | ||||||
|  |         android:id="@+id/imgStart" | ||||||
|  |         android:layout_width="20dp" | ||||||
|  |         android:layout_height="20dp" | ||||||
|  |        android:layout_margin="10dp" | ||||||
|  |         android:src="@mipmap/play" | ||||||
|  |         /> | ||||||
|  | 
 | ||||||
|  | </LinearLayout> | ||||||
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 353 B | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 342 B | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 904 B | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 929 B | 
		Loading…
	
		Reference in New Issue