安卓 网络编程

      最后更新:2021-11-26 20:30:37 手机定位技术交流文章

      第九章 网络编程

      安德烈系统通过Socket通讯、HTTP通讯、URL通讯和WebView支持网络通讯。

      HTTP通信是其中最常见的。本章讨论了移动电话如何使用 HTTP协议连接服务器端。

      9.1 HTTP协定概览

      超文本传输协议( HTTP) 定义了浏览器和服务器之间的通信规则 。

      当客户端连接到服务器段时, 提交给服务器的请求被称为 HTTP 请求。 服务器将对请求作出反应, 即 HTTP 。

      9.2 访问网络

      Andre为 HTTP 通信提供了大量支持, 允许使用标准 Java 类型 HttpurLconnection 的 URL 网络进行请求和响应功能。 HttpurConnection 来源于 URLConnection, 它允许提供、 接收或请求任何种类和长度的数据。 您还可以配置请求模式和花费的时间 。

      9.2.1 HttpURLConnection

      org. cn'; // 获取 URL 对象访问资源 OpenConnction () ;// 获得连接conn.SetRequest Method ("GET");/ 设置请求方法 Conn.SetConnectTimeout (5 00);/ 设置超时 PutPutStream =kon.Get Investextream () ;/ 接收服务器conn. Disconnect () 提供的投入流 ;//
      

      与服务器连接和检索服务器提供的数据的程序见上文所示,应当指出,使用 HttpurConnectction 对象进入网络需要超时,以防止在连接受阻时不回复,并影响用户体验。

      9.2 GET和POPST申请模式

      提出请求的方法是指以多种方式提出资源分配请求。

      1. GET方式提交数据

        GET 方法用于检索请求在实体中所指的资源信息,而它向服务器提供的参数也遵循请求。通过 HTTP 方法访问网络 URL通常小于 1KB 。

      2. 发送到服务器的参数不局限于请求后实体的 URL 长度。 当请求使用 POST 时, 请求参数会跟随请求实体的参数 。 由于用户无法看到浏览器中提供给服务器的请求参数, POST 安全不受 GET 技术的影响 。

        String path = "http://192.168.1.100:8080/web/LoginServlet";
                URL url = new URL(path);
                HttpURLConnection conn = (HttpURLConnection)url.openConnection();
                conn.setConnectTimeout(5000);
                conn.setRequestMethod("POST");
                //准备数据并给参数编码
                String data = "username = "+ URLEncoder.encode("zhangsan")+"&password="+URLEncoder.encode("123");
                //设置请求头数据提交方式,这里是以form表单的方式提交
                conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
                //设置提交数据的长度
                conn.setRequestProperty("Content-Length",data.length()+"");
                //post方式,实际上是浏览器把数据写给了服务器
                conn.setDoOutput(true); //设置允许向外写数据
                OutputStream os = conn.getOutputStream();
                os.write(data.getBytes()); //将参数写给服务器
                int code = conn.getResponseCode();
                if(code == 200) {
                    InputStream is = conn.getInputStream();
                }
        

      处理器信息传递机制(九.二.三)

      当您启动该应用程序时, Andre将首先启动一个UI 线索( 主线), 它将处理 UUI 界面控制并发布事件。 例如, 当您单击按钮的界面时, Andre 将把事件传播到按钮, 以便按钮对要完成的活动作出反应 。 如果这是一个耗时的活动, 比如联系网络以接收数据并将结果返回 UI 接口, 将会出现假死亡, 如果5 个未完成, Andre 的错误提示将是“ 强制关闭 ” 。 在这一点上, Noices可能会考虑将此类活动放入子行, 但只在主线中更新 Andre 的 UI 界面, 而其他线索将不会完成 。

      Andre 提议了一个前步后退后退的方法, Handler, 由 Handler 负责与主线进行通信。 通常, 一个 Handler 对象在主线中连接, 并在事件触发上形成一个子线, 以便执行某些耗时的活动 。 在子线中的工作完成后, 完成的信号( 信件对象) 将传送给 Handler, 当收到信号时, 主线 UI 将更新 。

      处理机制主要由四个重要目标组成:信息、处理、信息排队和环形,下文将简要加以讨论。

      1. Message

        信件是一个在线信息, 能够保存少量信息, 用于在多个线索之间传递信息。 信件字段可以包含一些数字值, 而 obj 字段可以包含对象对象 。

      2. Handler

        处理器是处理器, 通常用于发送和处理信件。 信件通常通过处理器对象的发件人Message 函数传输, 经过一系列处理后, 信件最终被传递到处理器Message 方法 。

      3. MessageQueue

        信件 队列是一个主要用于持有通过手动器提供的信件的信件的队列。 通过手动器发送的信件将存储在信件队列中, 每一个线索中只有一个信件队列对象, 而每个线索的队列只有一个, 主要是用于持有通过手动器提供的信件的队列。 通过手动器发送的信件将存储在信件队列中, 每个线索中只有一个信件队列对象 。

      4. Looper

        当您执行 Looper 环形函数时,您会输入一个无限循环。在信件队列中发现信件后,就会将其删除并上传到 Handler 信件中。每串线索中也只有一个 Looper 对象。当您在主行中创建一个 Looper 对象时,系统已经默认要有一个 Looper 对象,所以不需要明确的构造。 而子行中的 Handler 对象必须调用 Looper 。

      9.2 作战训练-在线图片浏览器

      1. 创建程序

        使用布局代码制作图像查看应用程序 :

        <?xml version="1.0" encoding="utf-8"?>
        <androidx.constraintlayout.widget.ConstraintLayout 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=".MainActivity">
        
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/line1"
                    android:orientation="horizontal"
                    android:layout_marginTop="5dp">
                    <EditText
                        android:layout_width="0dp"
                        android:layout_weight="5"
                        android:layout_height="wrap_content"
                        android:id="@+id/et1"
                        android:hint="请输入路径"></EditText>
                    <Button
                        android:layout_width="0dp"
                        android:layout_weight="1"
                        android:layout_height="wrap_content"
                        android:text="浏览"
                        android:textSize="19sp"
                        android:id="@+id/bt1"
                        android:onClick="click"></Button>
                </LinearLayout>
                <ImageView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_below="@+id/line1">
                    
                </ImageView>
            </RelativeLayout>
        
        </androidx.constraintlayout.widget.ConstraintLayout>
        
      2. 编写界面交互代码

        使用以下代码,使用 HttpurLconnection 获取所提供位置的网络图像, 并显示服务器在接口上返回的照片 :

        package cn.luoxin88.imageview;
        
        import androidx.appcompat.app.AppCompatActivity;
        
        import android.Manifest;
        import android.content.pm.PackageManager;
        import android.graphics.Bitmap;
        import android.graphics.BitmapFactory;
        import android.os.Bundle;
        import android.os.Handler;
        import android.os.Message;
        import android.text.TextUtils;
        import android.view.View;
        import android.widget.EditText;
        import android.widget.ImageView;
        import android.widget.Toast;
        
        import java.io.IOException;
        import java.io.InputStream;
        import java.net.HttpURLConnection;
        import java.net.MalformedURLException;
        import java.net.URL;
        
        public class MainActivity extends AppCompatActivity {
        
            protected static final int CHANGE_UI = 1;
            protected static final int ERROR = 2;
            private static final int REQUEST_CODE_ASK_PERMISSIONS = 123;
            private static EditText et;
            private static ImageView iv;
            //主线程创建消息处理器
            private static Handler handler = new Handler() {
                public void handlerMessage(android.os.Message msg) {
                    if(msg.what == CHANGE_UI){
                        Bitmap bitmap = (Bitmap)msg.obj;
                        iv.setImageBitmap(bitmap);
                    }
                    else if(msg.what == ERROR) {
                        // Toast.makeText(MainActivity.this,"显示图片错误",Toast.LENGTH_SHORT).show();
                    }
                }
            };
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                et = (EditText)findViewById(R.id.et1);
                iv = (ImageView) findViewById(R.id.iv1);
            }
            public void click(View view) {
                final String path = et.getText().toString().trim();
                if(TextUtils.isEmpty(path)) {
                    Toast.makeText(this,"图片路径不能为空",Toast.LENGTH_SHORT).show();
                }
                else {
                    System.out.println(path);
                    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                        int hasReadSmsPermission = checkSelfPermission(Manifest.permission.INTERNET);
                        if (hasReadSmsPermission != PackageManager.PERMISSION_GRANTED) {
                            requestPermissions(new String[]{Manifest.permission.READ_SMS}, REQUEST_CODE_ASK_PERMISSIONS);
                            return;
                        }
                    }
                    System.out.println(1);
                    //子线程访问网络,安卓4.0后访问网络不能放在主线程
                    new Thread() {
                        private HttpURLConnection conn;
                        private Bitmap bitmap;
                        public void run() {
                            //连接服务器GET请求获取图片
                            try {
                                URL url = new URL(path);
                                conn = (HttpURLConnection) url.openConnection();
                                conn.setRequestMethod("GET");
                                conn.setConnectTimeout(5000);
                                int code = conn.getResponseCode();
                                System.out.println(code);
                                if(code == 200) {
                                    InputStream is = conn.getInputStream();
                                    //将流转换为Bitmap对象
                                    bitmap = BitmapFactory.decodeStream(is);
                                    //将更改主界面的消息发给主线程
                                    Message message = new Message();
                                    message.what = CHANGE_UI;
                                    message.obj = bitmap;
                                    handler.sendMessage(message);
                                }
                                else {
                                    //请求服务器失败
                                    Message msg = new Message();
                                    msg.what = ERROR;
                                    handler.sendMessage(msg);
                                }
                            } catch (IOException e) {
                                e.printStackTrace();
                                Message msg = new Message();
                                msg.what = ERROR;
                                handler.sendMessage(msg);
        
                            }
                            conn.disconnect();
                        }
                    }.start();
                }
            }
        }
        
        
      3. 添加权限

        由于网络图像需要网络访问, 身份表文件必须启用 INTENET 权限 。

        <uses-permission android:name="android.permission.INTERNET"></uses-permission>
        
      4. 运行程序

        不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/13829.html

          热门文章

          文章分类