最后更新:2021-11-26 20:30:37 手机定位技术交流文章
安德烈系统通过Socket通讯、HTTP通讯、URL通讯和WebView支持网络通讯。
HTTP通信是其中最常见的。本章讨论了移动电话如何使用 HTTP协议连接服务器端。
超文本传输协议( HTTP) 定义了浏览器和服务器之间的通信规则 。
当客户端连接到服务器段时, 提交给服务器的请求被称为 HTTP 请求。 服务器将对请求作出反应, 即 HTTP 。
Andre为 HTTP 通信提供了大量支持, 允许使用标准 Java 类型 HttpurLconnection 的 URL 网络进行请求和响应功能。 HttpurConnection 来源于 URLConnection, 它允许提供、 接收或请求任何种类和长度的数据。 您还可以配置请求模式和花费的时间 。
org. cn'; // 获取 URL 对象访问资源 OpenConnction () ;// 获得连接conn.SetRequest Method ("GET");/ 设置请求方法 Conn.SetConnectTimeout (5 00);/ 设置超时 PutPutStream =kon.Get Investextream () ;/ 接收服务器conn. Disconnect () 提供的投入流 ;//
与服务器连接和检索服务器提供的数据的程序见上文所示,应当指出,使用 HttpurConnectction 对象进入网络需要超时,以防止在连接受阻时不回复,并影响用户体验。
提出请求的方法是指以多种方式提出资源分配请求。
GET方式提交数据
GET 方法用于检索请求在实体中所指的资源信息,而它向服务器提供的参数也遵循请求。通过 HTTP 方法访问网络 URL通常小于 1KB 。
发送到服务器的参数不局限于请求后实体的 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 将更新 。
处理机制主要由四个重要目标组成:信息、处理、信息排队和环形,下文将简要加以讨论。
Message
信件是一个在线信息, 能够保存少量信息, 用于在多个线索之间传递信息。 信件字段可以包含一些数字值, 而 obj 字段可以包含对象对象 。
Handler
处理器是处理器, 通常用于发送和处理信件。 信件通常通过处理器对象的发件人Message 函数传输, 经过一系列处理后, 信件最终被传递到处理器Message 方法 。
MessageQueue
信件 队列是一个主要用于持有通过手动器提供的信件的信件的队列。 通过手动器发送的信件将存储在信件队列中, 每一个线索中只有一个信件队列对象, 而每个线索的队列只有一个, 主要是用于持有通过手动器提供的信件的队列。 通过手动器发送的信件将存储在信件队列中, 每个线索中只有一个信件队列对象 。
Looper
当您执行 Looper 环形函数时,您会输入一个无限循环。在信件队列中发现信件后,就会将其删除并上传到 Handler 信件中。每串线索中也只有一个 Looper 对象。当您在主行中创建一个 Looper 对象时,系统已经默认要有一个 Looper 对象,所以不需要明确的构造。 而子行中的 Handler 对象必须调用 Looper 。
创建程序
使用布局代码制作图像查看应用程序 :
<?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>
编写界面交互代码
使用以下代码,使用 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();
}
}
}
添加权限
由于网络图像需要网络访问, 身份表文件必须启用 INTENET 权限 。
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
运行程序
不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,
本文由 在线网速测试 整理编辑,转载请注明出处。