80,472
社区成员




public class WebPicturesActivity extends Activity {
//声明视图组件
private TextView tv_webpictures_top;//显示文本信息
private CheckBox cb_pictures_select; //勾选图片
private ImageView iv_webpictures_download; //下载或删除图片
private Button btn_pictures_stop; //停止抓取图片
private ProgressBar pb_webpictures_loading; //深度抓取进度
private GridView gv_webpictures_loading; //抓取图片列表
private ImageAdapter adapter ;
public static boolean isEdit ;//记录当前Activity中View中的一个小图片是不是编辑状态,我在ImageAdapter中使用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_pictures);
// //获得一下Intent带过来的URL
// Intent intent = getIntent();
// String url = intent.getStringExtra("url");
// Log.e("TAG",url);
//拿到这个URL后,先不着急去联网,先设置layout布局的设置--比较麻烦,涉及到checkbox的样式的设置。
//弄完layout布局以后,再弄layout中的item 布局。
//两个都弄完了,然后让手机屏幕成为常亮状态.
//保持屏幕常亮
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
);
//然后初始化视图对象,写成一个方法,在这里调用。
init();
}
public String url ;
private void init() {//初始化视图组件
//先视图对象的初始化
tv_webpictures_top = (TextView) findViewById(R.id.tv_webpictures_top);
cb_pictures_select = (CheckBox) findViewById(R.id.cb_pictures_select);
iv_webpictures_download = (ImageView) findViewById(R.id.iv_webpictures_download);
btn_pictures_stop = (Button) findViewById(R.id.btn_pictures_stop);
pb_webpictures_loading = (ProgressBar) findViewById(R.id.pb_webpictures_loading);
gv_webpictures_loading = (GridView) findViewById(R.id.gv_webpictures_loading);
adapter = new ImageAdapter(this);//拿到外面声明,确保让外面的方法都能看到
gv_webpictures_loading.setAdapter(adapter);//此时集合中没有数据
/**
* 现在的目的是第一次联网获取每个图片的url
*
* 怎么实现的,借助于导入的第三方工具xUtiles,先得到访问的整个页面的html 代码,再用jsoup 解析
* html 代码,就得到了所有图片的url 。
*
*/
url = getIntent().getStringExtra("url");
url = AppUtils.checkUrlPre(url);//必须调用有返回值的此方法
//联网操作--封装成一个方法,在此处调用。能获取整个页面的html代码,最终能返回一个图片,让adapter来我们放到该放的位置去
getHttpImage(url);
/**
*最终的时候,我是要通过调用我ImageAdapter的notifixxxxxxx方法,用来更新视图
*
*
* 为什么是这个样子,因为第一次联网,得到的那些个图片的url 不是我感兴趣的,这些url 后的图片才是我
* 想盗取的,所以一开始显示出来的是一些url ,我通过不断的调用notifixxxxxxx方法来更新显示,当在调
* 用notifixxxxxxx方法的时候,其实还涉及到了getView() 方法的执行调用,所以去那里设置一下。
*
*
*/
// adapter.notifyDataSetChanged();
}
private ProgressDialog dialog ;
private List<ImageBean> imageBeansList= new ArrayList<ImageBean>() ;//是用户保存的,通过jsoup解析的所有图片的对象。也是后期用Adapter重新装数据的集合。
private Set<ImageBean> imageBeanSet = new HashSet<>();//是用来过滤相同图片的集合。
/**
* 这是联网的具体的操作
*
* @param url
*/
private void getHttpImage(final String url) {
Log.e("TAG","正在抓取图片的过程中。");
//先显示一个Dialog,说正在盗取xxx 网站的图片,请等待--但是我把showProgressDialog()写在另外一个地方
showProgressDialog("正在抓取" + url + "网站的图片", true);
//利用xUtiles工具联网得到整个页面的html
x.http().get(new RequestParams(url), new Callback.CommonCallback<String>() {
/**
* 正确联网,得到返回的数据
*
* @param html
*/
@Override
public void onSuccess(String html) {
//先Log一下
Log.e("TAG", html);
//保证请求之前集合数据是空的[保不齐上次打开过应用,集合里面有数据,对这次造成影响]
imageBeansList.clear();
imageBeanSet.clear();
//这里涉及到拿着这页面的url和 一整个页面的html 交给Jsoup进行解析
showImagesFromHtml(url, html);
dialog.dismiss();//到此,访问的该网站的所有的图片应该都显示在手机上了。但是并没有
//就当我的所有的图片已经加载出来了。
//提示是否进行深度抓取的Dialog放在这里。
// showDeepSearchDialog(url,html);
}
/**
* 请求网站失败,没有返回任何有意义的html
*
* @param ex
* @param isOnCallback
*/
@Override
public void onError(Throwable ex, boolean isOnCallback) {
Toast.makeText(WebPicturesActivity.this, "请求网站失败", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
/**
* 取消了网站的请求
* @param cex
*/
@Override
public void onCancelled(CancelledException cex) {
}
//结束网站的请求的时候
@Override
public void onFinished() {
Toast.makeText(WebPicturesActivity.this, "抓取图片成功。", Toast.LENGTH_SHORT).show();
}
});
}
/**
* 深度抓取的Dialog代码写在这里
*
* @param url
* @param html
*/
private void showDeepSearchDialog(String url, final String html) {
new AlertDialog.Builder(this)
.setTitle("请确认")
.setMessage("首页图片已经抓取完成,是否需要深度抓取" + url + "站点的图片")
.setPositiveButton("深度抓取", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//深度抓取
// deepSearch(html);
Log.e("TAG","能不能执行到这里!!!!!!!!!!!!!!!");
}
})
.setNegativeButton("下回吧", null)
.show();
}
/**
*
* 显示一下html上所有的图片
*
*[1]获得整个页面的html 代码,再通过jsoup解析html代码解析成一个一个的图片的String
*[2]用Set集合去装一下这些String类型的数据,以进行去重,把重复过滤。
*
* @param url
* @param html
*/
private void showImagesFromHtml(String url, String html) {
List<ImageBean> list = parseHtml(url, html);//这里才是真正的jsoup解析
Log.e("TAG", list.toString());
// imageBeanSet.addAll(list);//将二级页面的图片对象整体都加到imageBeansList 中来。//现在还是深度抓取
imageBeansList.addAll(list);
//接下来是用adapter来处理得到的总体的imageBeansList 集合
adapter.setList(imageBeansList);
// //这个地方不能用add,因为你一上来,就深度抓取图片。但是这个时候imageBeansList 还是null,不能用add。
// adapter.addList(imageBeansList);
adapter.notifyDataSetChanged();//更新视图,工作原理是不停的重绘,直到最后一个图片显示完。
}
/**
* 这里才是真正的jsoup解析-----网上查看,找方法理解---反正我这里是直接粘过来的==#
*
*
* 概述jsoup的解析过程:
* [1]新建一个ArrayList集合,泛型为 ImageBean。用以盛装包含url地址的ImageBean 对象。
* [2]通过Jsoup的静态方法 parse(html),把得到的html放入,得到Document类型的 doc对象。
* [3]调用doc对象的getElementsByTag("img")方法,把标签是“img”的标签对象拿出来。
* [4]进入循环,调用标签img的attr("src")方法,得到标签中的字符串src,src即图片的相对路径。
* 在这些src中,只保留以jpg 和 png 结尾的。
* 再通过checkSrc(url, src)方法,返回得到完整的单个图片的绝对路径src ,用以得到每一个单个的图片。
* new一个ImageBean(src)对象,把src 传进去,得到imageBean。
* 再在imageBeanSet中调用contains(imageBean)方法,过滤掉重复的imageBean对象
* [6]不停的重复以上方法,直到得到最后一个图片的src。
* [7]返回
* @param url
* @param html
*/
private List<ImageBean> parseHtml(String url, String html) {
List<ImageBean> list = new ArrayList<>();//这个list用于装html中,包含url地址的ImageBean的[图片]对象
Document doc = Jsoup.parse(html);
List<Element> imgs = doc.getElementsByTag("img");
for (Element img : imgs) {
String src = img.attr("src");
Log.e("TAG",src);
if (src.toLowerCase().endsWith("jpg") || src.toLowerCase().endsWith("png")) {
src = checkSrc(url, src);//得到完整的单个图片的绝对路径用以得到每一个单个的图片
Log.e("TAG",src);
ImageBean imageBean = new ImageBean(src);
//在imageBeanSet中过滤掉重复的imageBean对象
if (!imageBeanSet.contains(imageBean) && src.indexOf("/../") == -1) {
imageBeanSet.add(imageBean);
list.add(imageBean);
}
}
}
return list;
}
/**
*这里这个方法是把jsoup剥离出来的图片的相对路径src 变为一个完整的绝对网址url
*
*
* 为什么?因为通过jsoup来剥离出来了好多单个的以img/png/jpng等结尾的字符串,
* 但是,我哪知道xxxx.img到底是哪个网站上的图片,我不得在这个方法里补全一下得到完整的网址么。
*
* @param url
* @param src
* @return
*/
private String checkSrc(String url, String src) {
if(src.startsWith("http")) {
url = src;
}else if(src.startsWith("/")) {
url = url +src ;
}else {
url = url + "/" + src ;
}
return url;
}
/**
*
* 最开始,联网下载整个页面html时显示dialog 的方法
* @param message
* @param flag
*/
private void showProgressDialog(String message ,boolean flag){
dialog = new ProgressDialog(this);
if(flag) {
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);//圆形的Dialog
}else{
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//水平的Dialog
}
dialog.setTitle("提示信息");
dialog.setMessage(message);
dialog.show();
}
}