网络编程


安卓与互联网交互的三种方式:
在这里插入图片描述

加载网络图片

例子:加载一张网络图片到ImageView上。
https://03imgmini.eastday.com//mobile//20201218//20201218133813_362200891ebb137183288595c85eabf5_2_mwpm_03200403.jpg

程序要使用一些特殊的功能(如网络连接),需要在清单文件中添加相关的权限。

<uses-permission android:name="android.permission.INTERNET"/>
public class MainActivity extends Activity {
    
    //图片连接
    private String mUrl = "https://03imgmini.eastday.com//mobile//20201218//20201218133813_362200891ebb137183288595c85eabf5_2_mwpm_03200403.jpg";
    //图片显示控件
    private ImageView mImageView;   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);   
        mImageView = (ImageView) findViewById(R.id.image_view);
        
        //调用图片加载函数
        loadNetImage(mUrl, mImageView);
    }
  
    /**
     * 用于加载某个网络图片到图片显示控件上
     * @param url 网络图片的地址
     * @param view 要加载图片图片的控件
     */
    public void loadNetImage(final String url,ImageView view) {
        new Thread() {
            public void run() {
                
                //此处临时中转一下?
                String urlTemp = url;
                
                try {
                    //转换成标准连接格式类的对象
                    URL url = new URL(urlTemp);
                    //创建网络连接对象
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    //获得Http状态码
                    int httpCode = conn.getResponseCode();
                    //如果成功了再执行下一步
                    if(httpCode == 200) {
                        //通过连接对象获得输入流数据
                        InputStream is = conn.getInputStream();
                        //TODO 可以保存在本地了
                                               
                        //将输入流转换为Bitmap对象
                        final Bitmap bitmap = BitmapFactory.decodeStream(is);
                        
                        //切换到主线程中去设置图片显示
                        runOnUiThread(new Runnable() {
                            public void run() {
                                mImageView.setImageBitmap(bitmap);
                            }
                        });
                        
                        //关闭流
                        is.close();
                    }else {
                        Log.d("NetImage", "httpCode is not 200,is "+httpCode);
                    }
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                    Log.d("NetImage", e.toString());
                } catch (IOException e) {
                    e.printStackTrace();
                    Log.d("NetImage", e.toString());
                }
            }
        }.start();
    }
}

访问网络数据

接口由三部分组成:(数据来自聚合数据平台API)
http://v.juhe.cn/toutiao/index
?
type=tiyu
&
key=5465c4c5d60f72c3d756a9f1a9b8437d

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        getData();
    }
    /**
     * 访问服务器,并获得服务器返回的API数据
     */
    private void getData() {
        new Thread() {

            public void run() {
                String site = "http://v.juhe.cn/toutiao/index?type=tiyu&key=5465c4c5d60f72c3d756a9f1a9b8437d";
                try {
                    URL url = new URL(site);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();

                    int httpCode = conn.getResponseCode();
                    if (httpCode == 200) {
                        // 字节输入流
                        InputStream is = conn.getInputStream();
                        // 字节流→字符流
                        InputStreamReader isr = new InputStreamReader(is);
                        // 转换为缓冲流提高效率
                        BufferedReader br = new BufferedReader(isr);

                        // "水盆"
                        String buffer = new String();

                        // 存储已经读取的字符
                        String readStr = new String();

                        // 循环读取
                        while ((buffer = br.readLine()) != null) {
                            // 将刚读取的字符串拼接到之前读取的字符串上
                            readStr += buffer;
                        }

                        // 关闭流
                        br.close();
                        isr.close();
                        is.close();

                        Log.d("MainActivity", readStr);

                    } else {
                        Log.d("MainActivity", "http code is not 200,is " + httpCode);
                    }
                } catch (MalformedURLException e) {
                    Log.d("MainActivity", e.toString());
                } catch (IOException e) {
                    Log.d("MainActivity", e.toString());
                }
            }
        }.start();
    }
}

json

服务器返回的一对字符串实际上是JSON格式的。
格式(逐级嵌套):
{}表示的是JSONObject对象,内部是键值对
[]表示的是JSONArray对象,即JSONObject数组。

每条新闻包含的内容:
uniquekey ----每条新闻一个唯一识别码
title(必用) -----新闻标题
date -----新闻时间
category -----新闻类别
author_name -----新闻作者
url -----新闻连接
thumbnail_pic_s -----新闻图片

//解析JSON数据
JSONObject object = new JSONObject(readStr);
JSONObject result = object.getJSONObject("result");
JSONArray data = result.getJSONArray("data"); //拿到新闻数组
for(int i = 0;i<data.length();i++) { //遍历新闻数组
	JSONObject item = data.getJSONObject(i); //获得第i个新闻对象
	//解析新闻的内容
	String link = item.getString("url");
	String title = item.getString("title");
	//TODO 如果有一个ArrayList,那么可以把新闻内容解析后添加进去,这样就可以使用MVP模式加载滑动列表了
	 //补充:跨线程使用List,有比ArrayList还好用的类型Vector
	 //Vector用法跟ArrayList完全一样,区别在于多线程的优化更好。
	                            
	Log.d("MainActivity", title);
	Log.d("MainActivity", link);
	Log.d("MainActivity", " ");
}

使用Android给我们提供的扣脚Json解析类果然要慢慢扣,当然你也可以将解析的过程 反过来,自己拼接JSON,时间关系,这里就慢慢拼接了,哈哈,当然进阶部分我们 学习了第三方的一些Json解析库就轻松多了。

WebView 网页加载控件

专用于HTTP网页加载。

public class MainActivity extends Activity {    
    private WebView mWebView;
    
    //进度条弹窗
    private ProgressDialog mDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        mDialog = new ProgressDialog(MainActivity.this);
        mDialog.setTitle("科大头条");
        mDialog.setMessage("正在加载中");
        
        mWebView = (WebView) findViewById(R.id.web_view);
        //1.设置使用自己的WebView作为主网页加载控件
        //2.获得加载的不同状态的回调方法
        mWebView.setWebViewClient(new WebViewClient() {
            
            //网络页面开始加载的回调
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                mDialog.show(); //显示进度条
            }
            
            //网络页面加载结束的回调
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                mDialog.dismiss(); //关闭进度条
            }
        });
        
        //开启JS
        mWebView.getSettings().setJavaScriptEnabled(true);
        //加载网页
        mWebView.loadUrl("https://mini.eastday.com//a//201218141503193.html?qid=juheshuju&referrer=");
    }
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bruce.vvu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值