版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第13章访问网络在互联网时代,几乎没有一个Android应用程序是独立于网络之外的,因此,开发基于网络的应用无疑是必要的。本章对在Android程序中如何使用网络进行介绍,包括:使用ConnectivityManager管理网络状态、使用OkHttp访问网络服务、以及使用WebSocket访问网络服务。目录13.1使用ConnectivityManager检查网络状态13.2使用OkHttp访问网络服务13.3课后同步练习13.4使用WebSocket访问网络13.1使用ConnectivityManager检查网络状态使用网络进行数据通信之前,需要首先检查一下网络的状态,例如,当前网络是开启的还是关闭的,是Wi-Fi连接、GPRS连接还是UMTS连接等。可以使用AndroidSDK提供的ConnectivityManager类来获得网络的状态。要获得一个ConnectivityManager类的对象,可以使用如下语句:一旦得到ConnectivityManager类的对象,可以使用它提供的各种方法和属性来检查网络状态和监听网络状态的变化。ConnectivityManager常用的方法如下:(1)publicNetworkgetActiveNetwork()获得当前活动的网络对象。如果当前没有活动的网络,则返回null。(2)publicNetworkCapabilitiesgetNetworkCapabilities()获得系统支持的所有网络类型的信息。ConnectivityManagercm=(ConnectivityManager)Context.getSystemService(Context.CONNECTIVITY_SERVICE);下面举一个简单的例子来说明ConnectivityManager类的使用方法。这个例子首先检查当前是否有活动的网络,如果有,则打印出这个活动网络的相关信息。新建名为ch1301的工程。修改res/layout/activity_main.xml文件,为其中的TextView组件添加一个id属性,修改后的文件内容如下:<?xmlversion="1.0"encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">
<TextViewandroid:id="@+id/tv01"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="HelloWorld!"android:textSize="24sp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>修改MainActivity.java文件,修改后的代码如下:packagecom.example.ch1301;
import.ConnectivityManager;import.Network;import.NetworkCapabilities;import.NetworkInfo;importandroid.os.Bundle;importandroid.widget.TextView;importandroid.widget.Toast;
importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
publicclassMainActivityextendsAppCompatActivity{
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});
StringBuildersb=newStringBuilder();ConnectivityManagercm=(ConnectivityManager)this.getSystemService(MainActivity.CONNECTIVITY_SERVICE);Networknetwork=cm.getActiveNetwork();if(network==null){Toast.makeText(this,"unavailable",Toast.LENGTH_LONG).show();sb.append("没有可用网络!");}else{NetworkCapabilitiesnc=cm.getNetworkCapabilities(network);assertnc!=null;if(nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)){sb.append("蜂窝网络可用。");}if(nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)){sb.append("WIFI网络可用。");}if(nc.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)){sb.append("以太网络可用。");}}TextViewtv=this.findViewById(R.id.tv01);tv.setText(sb.toString());}}要获得及监听网络状态的变化,应用程序还需要在AndroidManifest.xml文件中申请android.permission.ACCESS_NETWORK_STATE权限。关于权限的详细内容将在下一章介绍。<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>13.2使用OkHttp访问网络服务可以在Android程序中使用HTTP协议访问服务端程序。HTTP,也就是HyperTextTransferProtocol,是一种标准的网络通信协议。HTTP通信指的是基于HTTP协议的数据通信。HTTP协议广泛用于Web客户端与Web服务端之间的数据通信,但是,HTTP协议不是只能用于Web客户端与Web服务端之间的通信,它可以用于任何客户端/服务器模式的通信应用中。Android提供了基本的基于HTTP协议访问网络的服务类,它就是HttpURLConnection。HttpURLConnection提供了完整的基于HTTP协议访问服务端URL的方式,但是,这个类使用起来不方便,因此,在编程实践中,开发者更喜欢使用一个第三方的HTTP协议包,它就是OkHttp。13.2.1HTTP服务端程序设计使用HTTP协议进行数据通信,需要一个服务端程序的支持,因此,需要首先构建一个HTTP服务端程序。所构建的服务端基于RESTful模式开发,客户端发送请求从服务端获取指定的图片,然后客户端将图片显示在终端界面上。由于服务端程序设计超出本书范围,因此,这里只对服务端程序设计进行简单的说明。本节所设计的服务端程序使用idea工具采用Java语言基于SpringBoot进行设计,客户端可以向服务端程序发送包含两个参数的请求用于控制服务端程序返回的图像类别:type参数,取值可以是1或者2,用于控制图像的种类;id参数,取值可以为1或者为2,用于控制图像的编号。首先使用idea工具创建基于SpringBoot的Web工程,在创建SpringBoot工程时,务必勾选“SpringWeb”依赖,如图。服务端主程序代码如下:packagecom.example.ch13httpserver;
importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplicationpublicclassCh13httpserverApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Ch13httpserverApplication.class,args);}}创建Java类,完成客户端的请求和应答,该程序是一个Restful的Controller,服务程序代码如下:packagecom.example.ch13httpserver;
importjakarta.servlet.http.HttpServletResponse;importorg.apache.tomcat.util.http.fileupload.IOUtils;importorg.springframework.core.metrics.StartupStep;importorg.springframework.web.bind.annotation.*;importorg.springframework.web.multipart.MultipartFile;
importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.util.List;
@RestControllerpublicclassImageController{//通过形如“http:://xxxx:8080/image/1/2”获取图片数据@GetMapping("/image/{type}/{id}")publicvoidgetImage(@PathVariable("type")inttype,@PathVariable("id")intid,HttpServletResponseresponse)throwsIOException{Stringfilename="D:/Current/images/png"+type+id+".png";Filefile=newFile(filename);response.setContentType("image/png");IOUtils.copy(newFileInputStream(file),response.getOutputStream());}
//通过GET方法形如“http:://xxxx:8080/image?type=1&id=1”获取图片数据@RequestMapping(value="/image")publicvoidmethod1(HttpServletResponseresponse,@RequestParam(value="type",defaultValue="0")Integertype,@RequestParam(value="id",defaultValue="0")Integerid)throwsIOException{Stringfilename="D:/Current/images/png"+type+id+".png";Filefile=newFile(filename);response.setContentType("image/png");IOUtils.copy(newFileInputStream(file),response.getOutputStream());}
//POST方法,在获取指定图片的同时,上传图片到服务端//通过形如“http:://xxxx:8080/image”的POST方法获取图片数据@PostMapping("/image")publicvoidpostImage(HttpServletResponseresponse,@RequestParam(value="type",defaultValue="0")Integertype,@RequestParam(value="id",defaultValue="0")Integerid,@RequestPart("images")List<MultipartFile>images)throwsIOException{System.out.println("type"+type);
if(!images.isEmpty()){for(MultipartFilemp:images){if(!mp.isEmpty()){Stringname=mp.getOriginalFilename();mp.transferTo(newFile("D:/Current/images/"+name));}}}Stringfilename="D:/Current/images/png"+type+id+".png";Filefile=newFile(filename);response.setContentType("image/png");IOUtils.copy(newFileInputStream(file),response.getOutputStream());}
//通过形如“http:://xxxx:8080/json”的POST方法获取图片数据@PostMapping("/json")publicvoidgetByJSON(HttpServletResponseresponse,@RequestBodyTypeAndIdti)throwsIOException{Stringfilename="D:/Current/images/png"+ti.type+ti.id+".png";Filefile=newFile(filename);response.setContentType("image/png");IOUtils.copy(newFileInputStream(file),response.getOutputStream());}
publicstaticclassTypeAndId{privateinttype;privateintid;
publicTypeAndId(inttype,intid){this.type=type;this.id=id;}
publicintgetType(){returntype;}
publicvoidsetType(inttype){this.type=type;}
publicintgetId(){returnid;}
publicvoidsetId(intid){this.id=id;}}}强调一下,为了能够使该服务端的程序能够正常运行,需要将4张图片分别命名为png11.png、png12.png、png21.png、png22.png,并放置在服务端程序所运行的计算机的D盘的“D:/Current/images/”目录下,这个目录也是上传文件的存放目录。13.2.2通过HTTPGET方法进行服务请求通过一个具体的例子来介绍如何使用OkHttp的GET方法(也就是HTTP的GET方法请求)从服务器端程序获取数据。该程序显示4个按钮,点击4个按钮中的任意一个,将从服务端获取图片相应,并在手机的下方显示获取的图片。本例子演示了使用服务端请求方式一和请求方式二从服务端获取图片。新建一个名为ch1302的工程。为了能够在程序中使用第三方的OkHttp包,需要将OkHttp相关包添加到工程中。为此,打开build.gradle文件,如图13-5所示,在文件中添加如下一行代码:implementation'com.squareup.okhttp3:okhttp:5.1.0'修改res/layout/activity_main.xml文件,修改后的文件内容如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity">
<Buttonandroid:id="@+id/id_btn_1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/text_btn_1"/>
<Buttonandroid:id="@+id/id_btn_2"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/text_btn_2"/>
<Buttonandroid:id="@+id/id_btn_3"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/text_btn_3"/>
<Buttonandroid:id="@+id/id_btn_4"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/text_btn_4"/>
<ImageViewandroid:id="@+id/id_iv"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="fitCenter"android:contentDescription="@string/hello_world"/>
</LinearLayout>修改res/values/strings.xml文件,在其中定义几个在布局文件中用到的字符串引用,内容如下:<resources><stringname="app_name">ch1302</string>
<stringname="hello_world">Helloworld!</string>
<stringname="text_btn_1">显示第一张小猫</string><stringname="text_btn_2">显示第二张小猫</string><stringname="text_btn_3">显示第一张礼盒</string><stringname="text_btn_4">显示第二张礼盒</string>
</resources>修改MainActivity.java文件,使之显示主界面,处理对按钮的点击事件,并根据点击的按钮通过OkHttp的GET方法从服务器端获得相应的图片并显示在ImageView组件中,修改后的文件内容如下:packagecom.example.ch1302;
importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;import.ConnectivityManager;import.Network;importandroid.os.Bundle;importandroid.os.Handler;importandroid.view.View;importandroid.widget.Button;importandroid.widget.ImageView;importandroid.widget.Toast;
importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
importjava.io.IOException;
importokhttp3.OkHttpClient;importokhttp3.Request;importokhttp3.Response;
publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{privateImageViewiv;privateBitmapbm;privateHandlerhandler;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});
bm=null;handler=newHandler();iv=this.findViewById(R.id.id_iv);
Buttonbtn_1=this.findViewById(R.id.id_btn_1);btn_1.setOnClickListener(this);Buttonbtn_2=this.findViewById(R.id.id_btn_2);btn_2.setOnClickListener(this);Buttonbtn_3=this.findViewById(R.id.id_btn_3);btn_3.setOnClickListener(this);Buttonbtn_4=this.findViewById(R.id.id_btn_4);btn_4.setOnClickListener(this);}
privatebooleancheckNetworkState(){ConnectivityManagercm=(ConnectivityManager)this.getSystemService(MainActivity.CONNECTIVITY_SERVICE);Networknetwork=cm.getActiveNetwork();if(network==null){Toast.makeText(this,"networkunavailable",Toast.LENGTH_LONG).show();returnfalse;}returntrue;}
@OverridepublicvoidonClick(Viewv){if(!checkNetworkState()){Toast.makeText(this,"网络没有打开,请打开网络后再试。",Toast.LENGTH_LONG).show();return;}
intid=v.getId();if(id==R.id.id_btn_1)downloadImageAndShow(1,1);elseif(id==R.id.id_btn_2)downloadImageAndShow(1,2);elseif(id==R.id.id_btn_3)downloadImageAndShow(2,1);elseif(id==R.id.id_btn_4)downloadImageAndShow(2,2);}
privatevoiddownloadImageAndShow(finalinttype,finalintid){newThread(()->{OkHttpClientclient=newOkHttpClient();
//方式一Requestrequest=newRequest.Builder().url("00:8080/image/"+type+"/"+id).build();//方式二/*Requestrequest=newRequest.Builder().url("00:8080/image?"+"type="+type+"&id="+id).build();*/Responseresponse;try{response=client.newCall(request).execute();}catch(IOExceptione){e.printStackTrace();return;}if(!response.isSuccessful()){return;}
byte[]b=null;try{b=response.body().bytes();}catch(IOExceptione){e.printStackTrace();return;}bm=BitmapFactory.decodeByteArray(b,0,b.length);handler.post(newRunnable(){@Overridepublicvoidrun(){iv.setImageBitmap(bm);}});}).start();}
}需要在AndroidManifest.xml文件中对网络相关的调用进行授权。<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="/apk/res/android"xmlns:tools="/tools">
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permissionandroid:name="android.permission.INTERNET"/>
<applicationandroid:allowBackup="true"android:usesCleartextTraffic="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Ch1302"><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><actionandroid:name="ent.action.MAIN"/><categoryandroid:name="ent.category.LAUNCHER"/></intent-filter></activity></application>
</manifest>13.2.3通过HTTPPOST方法进行服务请求通过HTTP的POST向服务端发送请求,可以传递更多的请求参数,甚至可以向服务端传递文件。在13.2.1节所设计的服务端程序中,当使用POST方法请求服务端服务时,前端还能够传递文件到服务端程序。下面通过一个例子介绍如何使用POST方法和Multipart格式从Android程序向服务器端程序传递Multipart数据体格式的请求数据。例子的运行效果与图13-6完全一样,只是实现的方式不同,同时,为了演示Multipart的数据请求,在请求数据包中附加了一个简单的图片文件,服务器端程序收到这个图片后保存D:/Current/images/目录下。本例子演示了使用服务端请求方式三从服务端获取图片。新建名为ch1303工程,主布局activity_main.xml文件以及字符串定义文件strings.xml、ch1302工程完全一致,还需要在build.gradle文件中添加对OkHttp的依赖:implementation'com.squareup.okhttp3:okhttp:5.1.0'因为要传递文件到服务端,首先在assets目录下放置一张名为啊16.jpg的图片文件。然后修改MainActivity.java文件为如下代码:packagecom.example.ch1303;
importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;import.ConnectivityManager;import.Network;importandroid.os.Bundle;importandroid.os.Handler;importandroid.view.View;importandroid.widget.Button;importandroid.widget.ImageView;importandroid.widget.Toast;
importandroidx.activity.EdgeToEdge;importandroidx.annotation.NonNull;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;
importokhttp3.Call;importokhttp3.Callback;importokhttp3.MediaType;importokhttp3.MultipartBody;importokhttp3.OkHttpClient;importokhttp3.Request;importokhttp3.RequestBody;importokhttp3.Response;
publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{privateImageViewiv;privateBitmapbm;privateHandlerhandler;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});
bm=null;handler=newHandler();iv=this.findViewById(R.id.id_iv);
Buttonbtn_1=this.findViewById(R.id.id_btn_1);btn_1.setOnClickListener(this);Buttonbtn_2=this.findViewById(R.id.id_btn_2);btn_2.setOnClickListener(this);Buttonbtn_3=this.findViewById(R.id.id_btn_3);btn_3.setOnClickListener(this);Buttonbtn_4=this.findViewById(R.id.id_btn_4);btn_4.setOnClickListener(this);}
privatebooleancheckNetworkState(){ConnectivityManagercm=(ConnectivityManager)this.getSystemService(MainActivity.CONNECTIVITY_SERVICE);Networknetwork=cm.getActiveNetwork();if(network==null){Toast.makeText(this,"networkunavailable",Toast.LENGTH_LONG).show();returnfalse;}returntrue;}
@OverridepublicvoidonClick(Viewv){if(!checkNetworkState()){Toast.makeText(this,"网络没有打开,请打开网络后再试。",Toast.LENGTH_LONG).show();return;}
intid=v.getId();if(id==R.id.id_btn_1)downloadImageAndShow(1,1);elseif(id==R.id.id_btn_2)downloadImageAndShow(1,2);elseif(id==R.id.id_btn_3)downloadImageAndShow(2,1);elseif(id==R.id.id_btn_4)downloadImageAndShow(2,2);}
privatevoiddownloadImageAndShow(finalinttype,finalintid){newThread(newRunnable(){@Overridepublicvoidrun(){OkHttpClientclient=newOkHttpClient();
MediaTypeMEDIA_TYPE_PNG=MediaType.parse("image/jpg");byte[]b;RequestBodyfileBody=null;try{InputStreamfis=getAssets().open("a16.jpg");b=newbyte[fis.available()];fis.read(b);fis.close();fileBody=RequestBody.Companion.create(b,MEDIA_TYPE_PNG);}catch(IOExceptione){thrownewRuntimeException(e);}RequestBodyrequestBody=newMultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("type",""+type).addFormDataPart("id",""+id).addFormDataPart("images","a16.jpg",fileBody).build();
Requestrequest=newRequest.Builder().url("00:8080/image").post(requestBody).build();
client.newCall(request).enqueue(newCallback(){@OverridepublicvoidonFailure(@NonNullCallcall,@NonNullIOExceptione){e.printStackTrace();}
@OverridepublicvoidonResponse(@NonNullCallcall,@NonNullResponseresponse)throwsIOException{if(!response.isSuccessful()){return;}
byte[]b=null;try{b=response.body().bytes();}catch(IOExceptione){e.printStackTrace();return;}bm=BitmapFactory.decodeByteArray(b,0,b.length);handler.post(()->iv.setImageBitmap(bm));}});}}).start();}}修改AndroidManifest.xml为如下内容:<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="/apk/res/android"xmlns:tools="/tools">
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permissionandroid:name="android.permission.INTERNET"/>
<applicationandroid:allowBackup="true"android:usesCleartextTraffic="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Ch1303"><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><actionandroid:name="ent.action.MAIN"/><categoryandroid:name="ent.category.LAUNCHER"/></intent-filter></activity></application>
</manifest>运行这个程序,显示与上例一致的结果。观察一下服务端的运行结果,可以发现,在服务端计算机的D:/Current/images/目录下,会有一张a16.jpg的文件:这是从前端APP上传的图片文件。13.2.4课堂同步练习在自己的计算机上,还原上一节的例子,并理解代码的各项内容,包括但不限于:HTTP的POST方法、multipart数据封装、OkHttp的使用。13.2.5使用POST和JSON进行服务请求通过HTTP的POST向服务端发送请求,可以传递JSON数据作为请求参数。在13.2.1节所设计的服务端程序中,当使用POST方法发送JSON格式的请求到服务端服务时,服务端也会把所请求的图片发送到前端APP。下面通过一个例子介绍如何使用POST方法和JSON格式从Android程序向服务器端程序传递请求数据。例子的运行效果与图13-6完全一样,只是实现的方式不同。本例子演示了使用服务端请求方式四从服务端获取图片。新建名为ch1304工程,主布局activity_main.xml文件以及字符串定义文件strings.xml、ch1302工程完全一致,还需要在build.gradle文件中添加对OkHttp的依赖:implementation'com.squareup.okhttp3:okhttp:5.1.0'修改MainActivity.java文件为如下代码:packagecom.example.ch1304;
importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;import.ConnectivityManager;import.Network;importandroid.os.Bundle;importandroid.os.Handler;importandroid.view.View;importandroid.widget.Button;importandroid.widget.ImageView;importandroid.widget.Toast;
importandroidx.activity.EdgeToEdge;importandroidx.annotation.NonNull;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
importorg.json.JSONException;importorg.json.JSONObject;
importjava.io.IOException;importjava.io.InputStream;
importokhttp3.Call;importokhttp3.Callback;importokhttp3.MediaType;importokhttp3.MultipartBody;importokhttp3.OkHttpClient;importokhttp3.Request;importokhttp3.RequestBody;importokhttp3.Response;
publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{privateImageViewiv;privateBitmapbm;privateHandlerhandler;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});
bm=null;handler=newHandler();iv=this.findViewById(R.id.id_iv);
Buttonbtn_1=this.findViewById(R.id.id_btn_1);btn_1.setOnClickListener(this);Buttonbtn_2=this.findViewById(R.id.id_btn_2);btn_2.setOnClickListener(this);Buttonbtn_3=this.findViewById(R.id.id_btn_3);btn_3.setOnClickListener(this);Buttonbtn_4=this.findViewById(R.id.id_btn_4);btn_4.setOnClickListener(this);}
privatebooleancheckNetworkState(){ConnectivityManagercm=(ConnectivityManager)this.getSystemService(MainActivity.CONNECTIVITY_SERVICE);Networknetwork=cm.getActiveNetwork();if(network==null){Toast.makeText(this,"networkunavailable",Toast.LENGTH_LONG).show();returnfalse;}returntrue;}
@OverridepublicvoidonClick(Viewv){if(!checkNetworkState()){Toast.makeText(this,"网络没有打开,请打开网络后再试。",Toast.LENGTH_LONG).show();
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 某麻纺厂生产调度实施准则
- 泰州中考语文散文阅读历年试题
- 五年级语文教学计划与课堂设计方案
- 初中英语听力训练教材及模拟试题
- 第三节 遥感图像的目视判断及其在地图编制中的应用说课稿2025学年高中地理人教版选修7地理信息技术应用-人教版2004
- 初中生历史人物生涯启蒙说课稿2025年33
- 老年护理中的科研与学术交流
- 初中适应教育心理2025说课稿
- 食品安全毒理学快速入门指南
- 汽车制造厂生产过程质量控制程序
- TCECS 1417-2023 预埋件现场检测技术规程
- 事业单位护理学知识题库及答案解析
- 《中西医协同老年健康状态评估指导》
- 光气管道施工方案设计
- DB41-T 2500-2023 地下水监测井洗井、修井技术规范
- 上海铁路局招聘笔试考什么内容
- 北师大版七年级数学下册-第一章-名校检测题【含答案】
- 浙二医院胸外科护士进修汇报
- DGTJ08-2323-2020 退出民防序列工程处置技术标准
- 党支部书记讲廉洁党课讲稿
- 广东省佛山市华英学校2024-2025学年上学期七年级入学分班考试英语试卷
评论
0/150
提交评论