加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Android AsyncTask异步处理抓取网页

发布时间:2020-05-28 21:04:53 所属栏目:Java 来源:互联网
导读:Android AsyncTask异步处理抓取网页

下面是脚本之家 jb51.cc 通过网络收集整理的代码片段。

脚本之家小编现在分享给大家,也给大家做个参考。

/**
 *
 * @author yanggang
 * @see http://blog.csdn.net/sunboy_2050
 */
public class MainActivity extends Activity {
    private EditText metURL;
    private TextView mtvPage;
    private Button mbtnConn;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        metURL = (EditText)findViewById(R.id.etURL);        // 输入网址
        mbtnConn = (Button)findViewById(R.id.btnConn);      // 连接网站
        mtvPage = (TextView)findViewById(R.id.tvPage);      // 显示网页
         
        mbtnConn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                connURL();
            }
        });
    }
 
    private void connURL(){
        URLTask urlTask = new URLTask(this);    // 实例化抽象AsyncTask
        urlTask.execute(metURL.getText().toString().trim());    // 调用AsyncTask,传入url参数
    }
     
    /** 继承AsyncTask的子类,下载url网页内容 */
    class URLTask extends AsyncTask<String,Integer,String> {
        ProgressDialog proDialog;
         
        public URLTask(Context context) {
            proDialog = new ProgressDialog(context,0);
            proDialog.setButton("cancel",new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog,int which) {
                    dialog.cancel();
                }
            });
            proDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {
                    finish();
                }
            });
            proDialog.setCancelable(true);
            proDialog.setMax(100);
            proDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            proDialog.show();
        }
 
        @Override
        protected void onPreExecute(){
            mtvPage.setText(R.string.hello_world);      // 可以与UI控件交互
        }
         
        @Override
        protected String doInBackground(String... params) {     // 在后台,下载url网页内容
            try {
                HttpGet get = new HttpGet(params[0]);           // url
                HttpResponse response = new DefaultHttpClient().execute(get);
                 
                if(response.getStatusLine().getStatusCode() == 200) {       // 判断网络连接是否成功
//                  String result = EntityUtils.toString(response.getEntity(),"gb2312");   // 获取网页内容
//                  return result;
                     
                    HttpEntity entity = response.getEntity();
                    long len = entity.getContentLength();       // 获取url网页内容总大小
                    InputStream is = entity.getContent();
                     
                    ByteArrayOutputStream bos = new ByteArrayOutputStream();
                    byte[] buffer = new byte[1024];
                    int ch = -1;
                    int count = 0;      // 统计已下载的url网页内容大小
                    while(is != null && (ch = is.read(buffer)) != -1 ) {
                        bos.write(buffer,ch);
                        count += ch;
                        if(len > 0) {
                            float ratio = count/(float)len * 100;   // 计算下载url网页内容百分比
                            publishProgress((int)ratio);    // android.os.AsyncTask.publishProgress(Integer... values)
                        }
                        Thread.sleep(100);
                    }
                    String result = new String(bos.toString("gb2312"));
                    return result;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
             
            return null;
        }
         
        @Override
        protected void onProgressUpdate(Integer... values) {    // 可以与UI控件交互
            mtvPage.setText("" + values[0]);    // 获取 publishProgress((int)ratio)的values
            proDialog.setProgress(values[0]);
        }
         
        @Override
        protected void onPostExecute(String result) {   // 可以与UI控件交互
            mtvPage.setText(result);
            proDialog.dismiss();
        }
    }
}

以上是脚本之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读