Android Studio之网络编程
Posted Mr.wu123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Studio之网络编程相关的知识,希望对你有一定的参考价值。
android Studio之网络编程
在Android studio中,有时候需要获取HTTP请求,简单点来说就是从服务器中获取相关资源和信息。HTTP协议定义了很多于服务器交互的方法,即HTTP请求的种类中,最基本的有4种,分别是GET、POST、PUT、DELETE。一个URL地址用于描述一个网络上的资源,而HTTP中GET、POST、PUT、DELETE就对应着对这个资源的查、改、增、删4个操作,我们最常见的就是GET和POST了。
- GET:通过请求URL得到资源。一般用于获取/查询资源信息。
- POST:用于向服务器提交新的内容。一般用于更新资源信息。
一 网络请求常见用法
在Android中,我们在很多时候都需要用到网络请求,最常见的地方就是我们在布局Recyclerview的时候,这时候我们界面需要的数据要从后台服务器取获取。
二 如何进行网络请求
在Android studio中我们要进行网络请求的话,必须先设置相关的依赖。
在AndroidManifest.xml文件中增添这两句代码。
(1)能够进行网络访问请求:
<uses-permission android:name="android.permission.INTERNET"/>
(2)能够访问以https开头的网络图片:
android:usesCleartextTraffic="true"
然后在build.gradle文件中导入相关依赖。
(1)能够访问网络图片:
implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
(2)能够访问gson格式数据:
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'org.xutils:xutils:3.9.0'
三 具体代码实现
这里举例了三种类型的json的数据类型:
- 单独的json
- json中带json
- json中嵌套数组
1 利用json去实现
在MainActivity的**protected void onCreate(Bundle savedInstanceState){}**的方法中写入一下代码
TextView textView = findViewById(R.id.text);
// 默认在主线程中更新UI,但在主线程中不能执行耗时操作
// 耗时操作 ->网络访问、文件读取
// NetworkOnMainThreadException 网络主线程异常
// 网络访问请求不应该放到主线程中
TextView textView = findViewById(R.id.text);
// 新建一个线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// 在这里执行的都是子线程
try {
URL url = new URL("http://148.70.46.9/object3");//user object array object1
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
//
InputStream inputStream = urlConnection.getInputStream();// 字节流
Reader reader = new InputStreamReader(inputStream);//字符流
BufferedReader bufferedReader = new BufferedReader(reader);// 缓存流 一次读取更多
String result = "";
String temp;
while ((temp = bufferedReader.readLine()) != null) {
result += temp;
}
Thread.sleep(2000);
Log.i("MainActivity", result);
// 子线程不能更新UI
// 更新UI操作 ->只能放到子线程中
// 切回主线程
String finalResult = result;
runOnUiThread(new Runnable() {
@Override
public void run() {
//主线程中
// 对json数据格式进行解析
// try {
// JSONObject jsonObject = new JSONObject(finalResult);
// String s = jsonObject.getString("name");
// textView.setText(s);
// } catch (JSONException e) {
// e.printStackTrace();
// }
// 对数组格式进行解析
// try {
// JSONArray jsonArray = new JSONArray(finalResult);
// for(int i=0;i<jsonArray.length();i++) {
// String s = (String) jsonArray.get(i);
// Log.i("MainActivity", "S==" + s);
// }
// } catch (JSONException e) {
// e.printStackTrace();
// }
// try {
// JSONObject jsonObject = new JSONObject(finalResult);
// JSONObject jsonObject1 = jsonObject.getJSONObject("class");
// String classname = jsonObject1.getString("classname");
// textView.setText(classname);
// } catch (JSONException e) {
// e.printStackTrace();
// }
// 解析JSON嵌套数组JSON
try {
JSONObject jsonObject = new JSONObject(finalResult);
JSONArray jsonArray = jsonObject.getJSONArray("students");
for(int i=0;i<jsonArray.length();i++){
JSONObject jsonObject1 = jsonArray.getJSONObject(i);
String s = jsonObject1.getString("name");
Log.i("MainActivity","S=="+s);
}
} catch (JSONException e) {
e.printStackTrace();
}
// textView.setText(finalResult);
}
});
inputStream.close();
reader.close();
bufferedReader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
2 利用gson去实现
gson在Android中能够更加方便的去服务器获取数据资源。先要根据你的json的数据类型去创建一个类,你能够手动创建也能够借助插件去创建。
如果借助插件去创建的话,先在setting中下载一个gson插件。
然后就是代码展示了,也是三种json类型,也是在**protected void onCreate(Bundle savedInstanceState){}**方法中。
TextView textView = findViewById(R.id.text);
x.Ext.init(getApplication());
//URL
RequestParams requestParams = new RequestParams("http://148.70.46.9/object1");
x.http().get(requestParams, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {//请求正常
Log.i("MainActivity","result:"+result);
//自动切回主线程
// textView.setText(result);
Gson gson = new Gson();//Gson更快的解析Json文件
Student student = gson.fromJson(result,Student.class);
textView.setText(student.classX.classname);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {//请求异常 可能访问的网址错误
Log.i("MainActivity","onError");
Toast.makeText(MainActivity.this,"网络异常",Toast.LENGTH_SHORT).show();
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
四 如果网络请求在fragment中
如果网络请求在fragment中的话,代码操作跟在Mainactivity中有些不一样,我就以我做到app界面举例。首先要在Mainactivity中写下这条网络请求初始化语句:
x.Ext.init(getApplication());
然后再在你所需要网络请求的fragment中==onActivityCreated(){}==方法中写在网络请求的代码:
RequestParams requestParams = new RequestParams("https://www.fastmock.site/mock/6feea46f0662885e32328be397a9264b/mywork/mywork6");
x.http().get(requestParams, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {//请求正常
Log.i("MainActivity","result:"+result);
//自动切回主线程
// textView.setText(result);
Gson gson = new Gson();//Gson更快的解析Json文件
MovieList movielist = gson.fromJson(result,MovieList.class);
list1.addAll(movielist.malorie);
Log.i("MainActivity","我快成功了");
myAdapter.notifyDataSetChanged();
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {//请求异常 可能访问的网址错误
Log.i("MainActivity","onError");
Toast.makeText(getActivity(),"网络异常",Toast.LENGTH_SHORT).show();
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
下面就是的我的app界面运行展示:
然后附上关键的代码
1 Mainactivity的代码
package com.huncm.c19;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import android.os.Bundle;
import android.view.View;
import org.xutils.x;
public class MainActivity extends AppCompatActivity {
SyFragment syFragment = new SyFragment();
ZqFragment zqFragment = new ZqFragment();
WdFragment wdFragment = new WdFragment();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
x.Ext.init(getApplication());
ConstraintLayout constraintLayout = findViewById(R.id.constraintLayout2);
ConstraintLayout constraintLayout1 = findViewById(R.id.constraintLayout);
ConstraintLayout constraintLayout2 = findViewById(R.id.constraintLayout3);
constraintLayout.setSelected(true);
constraintLayout1.setSelected(false);
constraintLayout2.setSelected(false);
getSupportFragmentManager().beginTransaction().replace(R.id.fragment,syFragment).commit();
constraintLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getSupportFragmentManager().beginTransaction().replace(R.id.fragment,syFragment).commit();
constraintLayout.setSelected(true);
constraintLayout1.setSelected(false);
constraintLayout2.setSelected(false);
}
});
constraintLayout1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getSupportFragmentManager().beginTransaction().replace(R.id.fragment,zqFragment).commit();
constraintLayout.setSelected(false);
constraintLayout1.setSelected(true);
constraintLayout2.setSelected(false);
}
});
constraintLayout2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
constraintLayout.setSelected(false);
constraintLayout1.setSelected(false);
constraintLayout2.setSelected(true);
getSupportFragmentManager().beginTransaction().replace(R.id.fragment,wdFragment).commit();
}
});
}
}
2 fragment的代码
package com.huncm.c19;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.google.gson.Gson;
import com.scwang.smart.refresh.footer.BallPulseFooter;
import com.scwang.smart.refresh.header.TwoLevelHeader;
import com.scwang.smart.refresh.layout.SmartRefreshLayout;
import com.scwang.smart.refresh.layout.api.RefreshLayout;
import com.scwang.smart.refresh.layout.listener.OnLoadMoreListener;
import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
import org.xutils.common.Callback;
import org.xutils.http.RequestParams;
import org.xutils.x;
import java.util.ArrayList;
import java.util.List;
public class SyFragment extends Fragment {
RecyclerView recyclerView;
MyAdapter myAdapter;
SmartRefreshLayout smartRefreshLayout;
List<Movie> list1 = new ArrayList<>();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_sy, container, false);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
recyclerView = getActivity().findViewById(R.id.recyclerview);
// 无下拉功能
// 上拉刷新 数据到底 重新加载新数据
// 开源
myAdapter = new MyAdapter();
recyclerView.setAdapter(myAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
smartRefreshLayout = getActivity().findViewById(R.id.smartReshesh);
smartRefreshLayout.setRefreshFooter(new BallPulseFooter(getActivity()));
smartRefreshLayout.setRefreshHeader(new TwoLevelHeader(getActivity()));
smartRefreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(@NonNull RefreshLayout refreshLayout) {
// todo 清楚数据
//Movielist.clear();
refreshLayout.finishRefresh(2000/*,false*/);//传入false表示刷新失败
// 重新添加数据
myAdapter.notifyDataSetChanged();
}
});
smartRefreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
@Override
public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
// todo 添加数据
refreshLayout.finishLoadMore(2000/*,false*/);//传入false表示加载失败
myAdapter.notifyDataSetChanged();
}
});
RequestParams requestParams = new RequestParams("https://www.fastmock.site/mock/6feea46f0662885e32328be397a9264b/mywork/mywork6");
x.http().get(requestParams, new Callback.CommonCallback<String>() {
错误记录Android Studio 编译报错 ( Could not determine java version from ‘11.0.8‘. | Android Studio 降级 )(代码片段
错误记录Android Studio 编译报错 ( Could not determine java version from ‘11.0.8‘. | Android Studio 降级 )(代码片段
Android 逆向Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | Visual Studio 中 SDK 和 NDK 安装位置 )(代码片段