安卓网络请求 httpconnection

        我们有时候的数据是来自于网络,不是所有的东西都在手机本地的,比如音乐的数据,我们需要网上拿到数据,歌曲列表就是 ,歌曲列表里面需要包含什么呢?歌手,歌曲名字,歌曲网址,图片等,步骤就是1.拿到数据2.解析(因为拿到的数据有很多个,比如歌曲有10首等,需要解析成一首一首的,解析成一个对象,或者集合,然后进行展示,列表展示, ,就在界面呈现了)。

2.在进行网络请求的时候需要三个东西,1.请求接口(以什么样的方式给我们提供的数据)2.请求协议(安卓的使用情况下用的是http(网页版,安卓版,ios版都可以使用,协议好处即用即链接,适用于三端,8080端口特点被防火墙封杀概率小)因为这个传输可以适用于Tcp三次握手不合适,udp可能丢包,推送消息适用Tcp无时无刻都能收到)3.请求方式(get,post),有时候我们使用接口的时候需要调接口postman接口调试工具。下面具体操作

1.java网络请求:用原始版的httpconnection,首先创建一个activty,networkactivty。

这是它的xml文件,一个button,一个textview

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.wj.administrator.mcz.activity.networkActivity"
    android:orientation="vertical">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Button" />

    <TextView
        android:id="@+id/textView6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="TextView" />


</LinearLayout>
二.在activty中进行操作,把这个控件找到,同时把内容显示在textview上面
1.首先在activty里面建立一个方法httpconn();同时要进行网络请求,用到一个类HttpURLConnection,这个类是咋么出来的,是通过Url里面哪的,从网址里面开辟一条链接
 URL url = new URL("http://route.showapi.com/213-4?showapi_appid=48962&topid=5&showapi_sign=9ad486a2461e47f4b3391171911f5b4b");
 HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
这个网址咋么拼接的http://route.showapi.com/213-4这个是必须的,?问号说明是get获取,下面这个是参数showapi_appid=48962&topid=5&showapi_sign=9ad486a2461e47f4b3391171911f5b4b

2.然后可以从链接里面拿数据,获取流,输入流
InputStream in = httpURLConnection.getInputStream();
//用一个StringBuffer来拼接读出来的字符串
 buff = new StringBuffer();
//同时把字节流转换为字符流
                    InputStreamReader inp = new InputStreamReader(in);

                    int temp;
                    while ((temp = inp.read()) != -1) {
                        buff.append((char) temp);

                    }
//这个是完整的网络请求方法,注意网络请求是一个耗时操作,所以应该让它在线程里面操作, new Thread(new Runnable() {.....只有这样才可以
同时还要有联网权限,就是这个<uses-permission android:name="android.permission.INTERNET" />,还要有处理流,不能在子线程里面进行处理数据修改ui,所以需要把得到的数据发送一个handler。 在子线程发送handler.sendEmptyMessage(1);在主线程中
 private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            //规定传1代表有数据

           TEX.setText(buff.toString());
           
        }
    };
//这个是网络请求的方法
 public void httpconn() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    URL url = new URL("http://route.showapi.com/213-4?showapi_appid=48962&topid=5&showapi_sign=9ad486a2461e47f4b3391171911f5b4b");
                    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                    InputStream in = httpURLConnection.getInputStream();
                    buff = new StringBuffer();
                    InputStreamReader inp = new InputStreamReader(in);

                    int temp;
                    while ((temp = inp.read()) != -1) {
                        buff.append((char) temp);

                    }

                    inp.close();
                    handler.sendEmptyMessage(1);

                } catch (Exception e) {
                    e.printStackTrace();
                    Log.e("mag", e + "出错了");
                }

            }
        }).start();

    }



//这个是完整的httpconncetion请求的代码
 
 
 
 
public class networkActivity extends AppCompatActivity {
    private Button butt;
    private TextView TEX;

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            //规定传1代表有数据
//            butt.setText(buff.toString());
//            TEX.setText(buff.toString());
            if(msg.what==2)
            {
                TEX.setText(msg.obj.toString());
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_network);
        butt = (Button) findViewById(R.id.button);
        TEX = (TextView) findViewById(R.id.textView6);
//        httpconn();
//        okhttp();
        post();

    }

    StringBuffer buff;

    public void httpconn() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    URL url = new URL("http://route.showapi.com/213-4?showapi_appid=48962&topid=5&showapi_sign=9ad486a2461e47f4b3391171911f5b4b");
                    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                    InputStream in = httpURLConnection.getInputStream();
                    buff = new StringBuffer();
                    InputStreamReader inp = new InputStreamReader(in);

                    int temp;
                    while ((temp = inp.read()) != -1) {
                        buff.append((char) temp);

                    }

                    inp.close();
                    handler.sendEmptyMessage(1);

                } catch (Exception e) {
                    e.printStackTrace();
                    Log.e("mag", e + "出错了");
                }

            }
        }).start();

    }
以这种方式进行请求的话,线程不好管理,会产生很多线程,反复请求,这个时候就会出现问题的


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值