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 Studio片段之间切换时地图片段不隐藏

Android 逆向Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | Visual Studio 中 SDK 和 NDK 安装位置 )(代码片段

如何在android studio中用另一个片段替换一个片段

我正在尝试在android studio上创建标签片段