IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 连接远程URL与API&连接有道API -> 正文阅读

[移动开发]连接远程URL与API&连接有道API

作者:recommend-item-box-tow

参考资料:Android中HttpURLConnection使用详解_小鹿迷鹿的博客-CSDN博客_android httpurlconnection

信息流逻辑:

inputStream(信息流)---->inputStreamReader(流载体)---->ButteredReader(将信息流读取)---->通过(String)Line---->StringBuilder(灵活字符串类)

InputStream inputStream=connection.getInputStream();//获取URL对应的信息
BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuilder=new StringBuilder();
String Line;
while ((Line=reader.readLine())!=null){
stringBuilder.append(Line);
}

URL读取逻辑

URL url=new URL("http://www.baidu.com"); //指定URL
HttpURLConnection connection=(HttpURLConnection)url.openConnection();//为HURLC类指定对应的URL
connection.setRequestMethod("GET");//发送请求

总逻辑:

onClicked{new Tread(new Runable(){@Override run()}).start()}

onClicked中实现了Tread.start()//线程启动

线程需要一个new Runable类实例化

Runable重写一个run方法

run方法实现以下几个任务

  1. 实现程序与URL的连接
  2. 实现URL资源获取
  3. URL资源解析转化可以展现的资源,例如StringBulider
  4. 展示这个资源

例子:开发一款基于有道翻译的极简翻译APP

21/09/2022 00:47

第一阶段:总体设计阶段

连接远程API,需要实现android studio联网问题,我选用了资料中方法3.

参考资料【Android】Android Studio虚拟机不能联网_-LDL的博客-CSDN博客_android studio虚拟机怎么联网

有的时候3G连不上,可以开启飞行模式达到重启的作用。

上述使用java的多线程技术实现URL连接,但是在安卓中我们完全可以使用AsyncTask的模式来实现

参考资料:详解Android中AsyncTask的使用_liuhe688的博客-CSDN博客_asynctask,

连接API主要在Activity中后台运行,引入AsyncTask<String, Integer, String>的概念

但是其实AsyncTask中的数据类型在这个例子中并不重要。

借这个机会也更加系统的学习了这一后台方式。(上次的学习这一知识点时一直没有时间练习)

对于方法:?doInBackground(String… params)来说,它用于处理主要事务

在这个需求下指的是API的连接,JSON对象的解析。

但是注意不能犹豫更新系统UI

系统UI的重置更新要在onPostExecute(String result)方法解决。

第二阶段:通过连接有道API,接收数据

主要分成两个阶段:

和URL建立联系

//明确URL
URL url=new URL("http://fanyi.youdao.com/openapi.dokeyfrom=youdianbao&key=1661829537&type=data&doctype=json&version=1.1&q="+str);
//为HURLC类指定对应的URL
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
//发送请求
connection.setRequestMethod("GET");

str为EditText输入的部分,URL部分符合有道API的申请格式。

处理信息流

//获取URL信息流
 InputStream inputStream=connection.getInputStream();
//将获得信息流转化成可读的信息集合
InputStreamReader input=new InputStreamReader(inputStream);
BufferedReader reader=new BufferedReader(input);
String Line;
StringBuilder stringBuilder=new StringBuilder();//一种灵活的String
 while ((Line=reader.readLine())!=null){//从信息集合中读取这一行String
       stringBuilder.append(Line);//将这一行String添加到StringBuilder中,这种全新的String可以显示
 }

StringBuilder是一种可以通过append(String)在字符串后面续写的字符串格式。

上面两个部分具有普遍的参考性,除了URL需要个性化配置。

第三阶段:解析JSON数据并使之正常输出

参考资料:https://wangbaiyuan.cn/android-java-parsing-api-youdao-translation-json-data.html

有道词典JSON基本上做到了要素全覆盖,这也是我选用这个作为练习的原因

boolean flag=JSONObject.has(“key”)判断是否存在

X value=JSONObject.getX(“key”)得到所需数据

1.获取URL传递过来的JSON信息

JSONObject replyJson=new JSONObject(stringBuilder.toString());

2.解析正常数据:

String query = replyJson.getString("query");

3.JSON key=translationStr对应很多JSON value情况:

JSONArray translation = replyJson.has("translation") ? replyJson.getJSONArray("translation") : null;
String translationStr="";
if(translation!=null){
 //translationStr="\n翻译:\n";
     for(int i=0;i<translation.length();i++){
       translationStr+=translation.getString(i);
       //translationStr+="\t【"+(i+1)+"】"+translation.getString(i)+"\n";
      }
}

4.JSON key=basic对应的JSON value也是JSONObject

JSONObject basic = replyJson.has("basic") ? replyJson.getJSONObject("basic") : null;
 if(basic!=null){//basic里面有很多JSON键值对
                        String phonetic=basic.has("phonetic")? basic.getString("phonetic"):null;
                        String uk_phonetic=basic.has("uk-phonetic")? basic.getString("uk-phonetic"):null;
                        String us_phonetic=basic.has("us-phonetic")? basic.getString("us-phonetic"):null;

         //String phoneticStr=(phonetic!=null? "\n发音:"+phonetic:"") +(uk_phonetic!=null? "\n英式发音:"+uk_phonetic:"") +(us_phonetic!=null? "\n美式发音:"+us_phonetic:"");

//JSON数组标准解决方案
                        JSONArray explains=basic.has("explains")? basic.getJSONArray("explains"):null;

                        String explainStr="";
                        if(explains!=null){
                            //explainStr="\n\n释义:\n";
                            for(int i=0;i<explains.length();i++){
                                 explainStr+=explains.getString(i);
                                //explainStr+="\t【"+(i+1)+"】"+explains.getString(i)+"\n";
                            }
                        }

第四阶段:实现Fragment承接相应的功能(增加程序可维护性)

public void onActivityCreated(Bundle savedInstanceState)中实现后台运行

题外注意:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View View = inflater.inflate(R.layout.fragment,container,false);

然后View下才能得到组件;但是在CreateView下需要return 新的view

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view=inflater.inflate(R.layout.fragment_a, container, false);
            Button button=view.findViewById(R.id.button);
            response=(TextView)view.findViewById(R.id.response);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    EditText editText=(EditText)view.findViewById(R.id.editText);
                    input=editText.getText().toString();
                    otherTask=new otherTask();
                    otherTask.execute();
                }
            });
        return view;

注意最下面的一行,可以达到同样效果;

之后可以试一试:实现不同的Fragment实现不同的API;

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 21:08:24  更:2022-09-24 21:11:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/29 16:22:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码