struts2服务端与android交互

本文主要包括以下内容

  1. android与struts2服务器实现登陆
  2. android从struts2服务器获取list数据
  3. android上传数据到struts2服务器

服务器端代码

package com.easyway.json.android;import java.util.HashMap;
import java.util.Map;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;import com.opensymphony.xwork2.ActionSupport;/*** 在android中有时候我们不需要用到本机的SQLite数据库提供数据,更多的时候是从网络上获取数据,* 那么Android怎么从服务器端获取数据呢?有很多种,归纳起来有*一:基于Http协议获取数据方法。*二:基于SAOP协议获取数据方法,*那么我们的这篇文章主要是将关于使用Http协议获取服务器端数据,*这里我们采取的服务器端技术为java,框架为Struts2,或者可以有Servlet,又或者可直接从JSP页面中获取数据。*那么,接下来我们便开始这一路程:*首先:编写服务器端方法,我这里采用的MVC框架是Struts2,目的很单纯,就是为了以后做个完整的商业项目,*技术配备为:android+SSH。当然,篇幅有限,我这里就直接用Strtus2而已。*服务器端:新建WebProject ,选择Java ee 5.0.*为了给项目添加Struts2的支持,我们必须导入Struts2的一些类库,如下即可(有些jar包是不必的,但是我们后来扩展可能是要使用到的,就先弄进去):*xwork-core-2.2.1.1.jar  struts2-core-2.2.1.1.jar commons-logging-1.0.4.jar  freemarker-2.3.16.jar*ognl-3.0.jar  javassist-3.7.ga.jar commons-ileupload.jar commons-io.jar json-lib-2.1-jdk15.jar  *处理JSON格式数据要使用到 struts2-json-plugin-2.2.1.1.jar   * 基于struts2的json插件.* * * 采用接口注入的方式注入HttpServletRequest,HttpServletResponse对象* * @author longgangbai**/
public class LoginAction extends ActionSupport implements ServletRequestAware,ServletResponseAware {/** * */private static final long serialVersionUID = 1L;HttpServletRequest request;HttpServletResponse response;private String userName;private String password;public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public void setServletRequest(HttpServletRequest request) {this.request = request;}public void setServletResponse(HttpServletResponse response) {this.response = response;}/*** 模拟用户登录的业务*/public void login() {try {//如果不采用接口注入的方式的获取HttpServletRequest,HttpServletResponse的方式// HttpServletRequest request =ServletActionContext.getRequest();// HttpServletResponse response=ServletActionContext.getResponse();this.response.setContentType("text/json;charset=utf-8");this.response.setCharacterEncoding("UTF-8");//JSONObject json=new JSONObject(); Map<String,String> json=new HashMap<String,String>();if ("admin".equals(userName)&&"123456".equals(password)) {json.put("message", "欢迎管理员登陆");} else if ((!"admin".equals(userName))&&"123456".equals(password)) {json.put("message", "欢迎"+userName+"登陆!");} else {json.put("message", "非法登陆信息!");}byte[] jsonBytes = json.toString().getBytes("utf-8");response.setContentLength(jsonBytes.length);response.getOutputStream().write(jsonBytes);response.getOutputStream().flush();response.getOutputStream().close();} catch (Exception e) {e.printStackTrace();}}
}

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- setting encoding,DynamicMethod,language      
<constant name="struts.custom.i18n.resources" value="messageResource"></constant>    --><constant name="struts.i18n.encoding" value="UTF-8"/><constant name="struts.enable.DynamicMethodInvocation"  value="true"/><!-- add package here extends="struts-default"--><package name="default" extends="json-default"><!--需要将struts-default改为--><action name="login" class="com.easyway.json.android.LoginAction"method="login"><result type="json"/><!--返回值类型设置为json,不设置返回页面--></action></package>
</struts>

ajax测试页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Ajax调用web服务</title>
<script type="text/javascript">
var xmlHttpReq;    //用于保存XMLHttpRequest对象的全局变量//用于创建XMLHttpRequest对象
function createXmlHttp() {//根据window.XMLHttpRequest对象是否存在使用不同的创建方式
//    if (window.XMLHttpRequest) {
//       xmlHttp = new XMLHttpRequest();                  //FireFox、Opera等浏览器支持的创建方式
//   } else {
//      xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");//IE浏览器支持的创建方式
//    }if (window.ActiveXObject) {xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");} else if (window.XMLHttpRequest) {xmlHttpReq = new XMLHttpRequest();}
}function loadAjax() {createXmlHttp();                        //创建XmlHttpRequest对象var url="http://localhost:8080/AndroidStruts2JSON/login.action?userName=admin&password=123456&date="+new Date();//xmlHttpReq.open("get", encodeURI(encodeURI(url+param,"UTF-8"),"UTF-8"), true);xmlHttpReq.open("get", encodeURI(encodeURI(url,"UTF-8"),"UTF-8"), true);//上传图片xmlHttpReq.setrequestheader("content-type","application/x-www-form-urlencoded");//post提交设置项xmlHttpReq.onreadystatechange = loadCallback;  //IE这里设置回调函数xmlHttpReq.send(null);}function loadCallback() {//alert(xmlHttpReq.readyState);if (xmlHttpReq.readyState == 4) {alert("aa");//if(xmlHttpReq.status==200){document.getElementById("contentDiv").innerHTML=xmlHttpReq.responseText;//}}
}</script><body>
<div id="contentTypeDiv">
</div>
<br/><br/>
<div id="contentDiv">
</div><input type="button" value="调用" onclick="loadAjax()"></body>
</head>
</html>

手机代码

package com.easyway.android.json;import java.io.IOException;import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
/*** 在现在开发的项目中采用Android+REST WebService服务方式开发的手机平台很少采用*  soap协议这种方式,主要soap协议解析问题,增加了代码量。*  *  * 在android中有时候我们不需要用到本机的SQLite数据库提供数据,更多的时候是从网络上获取数据,* 那么Android怎么从服务器端获取数据呢?有很多种,归纳起来有*  一:基于Http协议获取数据方法。*  二:基于SAOP协议获取数据方法**备注:在网络有关的问题最好添加以下两项:*   1.线程和虚拟机策略*   ///在Android2.2以后必须添加以下代码
*           //本应用采用的Android4.0
*           //设置线程的策略
*            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()   
*            .detectDiskReads()   
*            .detectDiskWrites()   
*            .detectNetwork()   // or .detectAll() for all detectable problems   
*            .penaltyLog()   
*            .build());   
*           //设置虚拟机的策略
*         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()   
*                    .detectLeakedSqlLiteObjects()   
*                    //.detectLeakedClosableObjects()   
*                    .penaltyLog()   
*                    .penaltyDeath()   
*                    .build());
*      2.可以访问网络的权限:
*       即AndroidManifest.xml中配置:
*        <uses-permission android:name="android.permission.INTERNET"/>** * @author longgangbai* **/
public class AndroidHttpJSONActivity extends Activity {private static  String processURL="http://192.168.1.130:8080/AndroidStruts2JSON/login.action?";private EditText txUserName;private EditText txPassword;private Button btnLogin;/***  Called when the activity is first created.*/@Overridepublic void onCreate(Bundle savedInstanceState) {///在Android2.2以后必须添加以下代码//本应用采用的Android4.0//设置线程的策略StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()   .detectDiskReads()   .detectDiskWrites()   .detectNetwork()   // or .detectAll() for all detectable problems   .penaltyLog()   .build());   //设置虚拟机的策略StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()   .detectLeakedSqlLiteObjects()   //.detectLeakedClosableObjects()   .penaltyLog()   .penaltyDeath()   .build());super.onCreate(savedInstanceState);//设置页面布局setContentView(R.layout.main);//设置初始化视图initView();//设置事件监听器方法setListener();}/*** 创建初始化视图的方法*/private void initView() {btnLogin=(Button)findViewById(R.id.btnLogin);txPassword=(EditText)findViewById(R.id.txtPassword);txUserName=(EditText)findViewById(R.id.txtUserName);}/*** 设置事件的监听器的方法*/private void setListener() {btnLogin.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String userName=txUserName.getText().toString();String password=txPassword.getText().toString();loginRemoteService(userName,password);}});}/*** 获取Struts2 Http 登录的请求信息* @param  userName* @param  password*/public void loginRemoteService(String userName,String password){String result=null;try {//创建一个HttpClient对象HttpClient httpclient = new DefaultHttpClient();//远程登录URLprocessURL=processURL+"userName="+userName+"&password="+password;Log.d("远程URL", processURL);//创建HttpGet对象HttpGet request=new HttpGet(processURL);//请求信息类型MIME每种响应类型的输出(普通文本、html 和 XML,json)。允许的响应类型应当匹配资源类中生成的 MIME 类型//资源类生成的 MIME 类型应当匹配一种可接受的 MIME 类型。如果生成的 MIME 类型和可接受的 MIME 类型不 匹配,那么将//生成 com.sun.jersey.api.client.UniformInterfaceException。例如,将可接受的 MIME 类型设置为 text/xml,而将//生成的 MIME 类型设置为 application/xml。将生成 UniformInterfaceException。request.addHeader("Accept","text/json");//获取响应的结果HttpResponse response =httpclient.execute(request);//获取HttpEntityHttpEntity entity=response.getEntity();//获取响应的结果信息String json =EntityUtils.toString(entity,"UTF-8");//JSON的解析过程if(json!=null){JSONObject jsonObject=new JSONObject(json);result=jsonObject.get("message").toString();}if(result==null){json="登录失败请重新登录";}//创建提示框提醒是否登录成功AlertDialog.Builder builder=new Builder(AndroidHttpJSONActivity.this);builder.setTitle("提示").setMessage(result).setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}}).create().show();} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

参考链接

Android+struts2+JSON方式的手机开发 - topMan’blog - ITeye技术网站

效果如下

struts

android从struts2服务器获取list数据

参考链接

android–使用Struts2服务端与android交互 - android开发实例 - 博客园

效果如下

android从struts2服务器获取list数据

android上传数据到struts2服务器

android端代码

package com.zj.wifitest;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;import org.json.JSONObject;import android.app.Activity;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void click(View view){run();}public void run() {new Thread() {@Overridepublic void run() {try {HttpURLConnection conn = null;String content = "";try {// 为了测试取消连接// Thread.sleep(5000);// http联网可以用httpClient或java.net.url// URL url = new URL(////// "http://115.28.34.52:8080/Car_Experiment/carInsert_insert_info.action");// carInsert_insert_info.action"URL url = new URL("http://120.27.126.68:8080/CarServer/transAction");conn = (HttpURLConnection) url.openConnection();conn.setDoInput(true);conn.setDoOutput(true);conn.setConnectTimeout(1000 * 30);conn.setReadTimeout(1000 * 30);conn.setRequestMethod("GET");conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");OutputStream output = conn.getOutputStream();JSONObject jsonObject = new JSONObject();jsonObject.put("0C", "0A0B");jsonObject.put("0D", "0B");jsonObject.put("10", "0A0B");jsonObject.put("11", "0B");//jsonObject.put("13", "0B");
//                          jsonObject.put("14", "0A0B");
//                          jsonObject.put("15", "0A0B");
//                          jsonObject.put("16", "0A0B");
//                          jsonObject.put("17", "0A0B");
//                          jsonObject.put("18", "0A0B");
//                          jsonObject.put("19", "0A0B");
//                          jsonObject.put("1A", "0A0B");
//                          jsonObject.put("1B", "0A0B");jsonObject.put("2F", "0A0B");jsonObject.put("02", "0A0B");System.out.println(jsonObject.toString());output.write(jsonObject.toString().getBytes());output.flush();output.close();int responseCode = conn.getResponseCode();Log.i("test", "responseCode"+responseCode);InputStream in = conn.getInputStream();System.out.println("responseCode=" + responseCode);if (responseCode == HttpURLConnection.HTTP_OK) {System.out.println("responseCode=" + HttpURLConnection.HTTP_OK);Log.i("test", "successed");// InputStreamReader reader = new// InputStreamReader(in,charSet);BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));String line = null;while ((line = reader.readLine()) != null) {content += line;}System.out.println("result:" + content);}in.close();} catch (Exception e) {e.printStackTrace();} finally {conn.disconnect();conn = null;}} catch (Exception e) {e.printStackTrace();}}}.start();}
}

服务器端代码

package whu.zhengrenjie.Action;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;import net.sf.json.JSONObject;import org.apache.struts2.ServletActionContext;import whu.zhengrenjie.Model.SimpleService;
import whu.zhengrenjie.Util.Util;import com.opensymphony.xwork2.ActionSupport;public class TransDataAction extends ActionSupport {private SimpleService simpleService;private BufferedReader reader;public SimpleService getSimpleService() {return simpleService;}public void setSimpleService(SimpleService simpleService) {this.simpleService = simpleService;}@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubif (Util.TEST) {String test;JSONObject jsonObject = new JSONObject();jsonObject.put("0C", "0000");jsonObject.put("0D", "00");jsonObject.put("10", "0000");jsonObject.put("11", "00");jsonObject.put("2F", "00");jsonObject.put("02", "12345678");test = jsonObject.toString();System.out.println("----------------------" + test);simpleService.insert(test);} else {try {String request = "";String temp = "";System.out.println("herrrrrrrrrrrrre");reader = new BufferedReader(new InputStreamReader(ServletActionContext.getRequest().getInputStream(),"UTF-8"));while ((temp = reader.readLine()) != null) {request += temp;}simpleService.insert(request);} catch (IOException e) {// TODO Auto-generated catch blockce.printStackTrace();} finally {reader.close();}}return super.execute();}
}

SimpleService

package whu.zhengrenjie.Model;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;import net.sf.json.JSONObject;
import whu.zhengrenjie.DAO.SimpleDAO;
import whu.zhengrenjie.PO.RunTimePO;
import whu.zhengrenjie.Util.Util;public class SimpleService {private int count = 0;private SimpleDAO simpleDAO;private RunTimePO runTimePO;private JSONObject jsonObject;public SimpleDAO getSimpleDAO() {return simpleDAO;}public void setSimpleDAO(SimpleDAO simpleDAO) {this.simpleDAO = simpleDAO;}public RunTimePO getRunTimePO() {return runTimePO;}public void setRunTimePO(RunTimePO runTimePO) {this.runTimePO = runTimePO;}public void insert(String requestStr) {jsonObject = JSONObject.fromObject(requestStr);String rpmStr = (String) jsonObject.get("0C");if (!rpmStr.contains("0000")) {double rpm = Integer.parseInt(rpmStr, 16) / 4;  runTimePO.setRpm(rpm);if (Util.DEBUG) {System.out.println(count++);}} else {runTimePO.setRpm(0);}String speedStr = (String) jsonObject.get("0D");if (!speedStr.contains("00")) {double speed = Integer.parseInt(speedStr, 16);runTimePO.setSpeed(speed);if (Util.DEBUG) {System.out.println(count++);}} else {runTimePO.setSpeed(0);}String airSpeedStr = (String) jsonObject.get("10");if (!airSpeedStr.contains("0000")) {double airSpeed = Integer.parseInt(airSpeedStr, 16) / 100;runTimePO.setAirSpeed(airSpeed);if (Util.DEBUG) {System.out.println(count++);}} else {runTimePO.setAirSpeed(0);}String throttleStr = (String) jsonObject.get("11");if (!throttleStr.contains("00")) {double throttle_1 = Integer.parseInt(throttleStr, 16) * 100 / 255;runTimePO.setThrottle(throttle_1);if (Util.DEBUG) {System.out.println(count++);}} else {runTimePO.setThrottle(0);}String VIN=(String) jsonObject.get("02");runTimePO.setSIN(VIN);String oilLevelStr = (String) jsonObject.get("2F");if (!oilLevelStr.contains("00")) {double oilLevel = Integer.parseInt(oilLevelStr, 16) * 100 / 255;runTimePO.setOilLevel(oilLevel);if (Util.DEBUG) {System.out.println(count++);}} else {runTimePO.setOilLevel(0);}try {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");Date date = new Date();String time = sdf.format(date);date = sdf.parse(time);runTimePO.setDate(date);} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}simpleDAO.insert();}
}

完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爆款专栏《Python 黑科技》目录导航丨进度:12/50

《Python 快速入门专栏丨掌握基础》和《Python 黑科技丨练习应用》由 CSDN 博客专家丨全站排名 Top 8 的硬核博主 不吃西红柿 倾力打造&#xff0c;旨在帮助大家快速入门掌握 Python。 更有学习资料&#xff0c;简历和 PPT 模板&#xff0c;微信公众号 【信息技术智库】关注我&…

干货|2018年中国智能硬件行业现状与发展趋势报告

来源&#xff1a;前瞻产业研究院未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网…

一文看懂芯片测试产业

来源&#xff1a;基业常青经济研究院从IDM到垂直分工&#xff0c;IC产业专业化分工催生独立测试厂商出现。集成电路产业从上世纪60年代开始逐渐兴起&#xff0c;早期企业都是IDM运营模式&#xff08;垂直整合&#xff09;&#xff0c;这种模式涵盖设计、制造、封测等整个芯片生…

Android之圆角矩形

安卓圆角矩形的定义 在drawable文件夹下&#xff0c;定义corner.xml <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/android" android:shape"rectangle"> <!-…

”大脑“爆发背后是50年互联网架构重大变革

前言&#xff1a;面对即将到来的2019年&#xff0c;互联网诞生50年&#xff0c;将是诸多纪念活动中重要的一个&#xff0c;经过50年的发展&#xff0c;互联网究竟发生什么重要的变化&#xff0c;通过这篇文章试图进行一次总结&#xff0c;也作为提前向互联网50年的致敬。作者&a…

动图|帮你一次性搞清楚 40种传感器工作原理

来源&#xff1a;一览众车/东方仿真物联网智库 转载摘要&#xff1a;帮你一次性搞清楚 40种传感器工作原理扩散硅式压力传感器应变加速度感应器压阻式传感器测量液位的工作原理MQN型气敏电阻结构及测量电路气泡式水平仪的工作原理布料张力测量及控制原理直滑式电位器控制气缸活…

Android实现高仿QQ附近的人搜索展示

本文主要实现了高仿QQ附近的人搜索展示&#xff0c;用到了自定义控件的方法 最终效果如下 1.下面展示列表我们可以使用ViewPager来实现&#xff08;当然如果你不觉得麻烦&#xff0c;你也可以用HorizontalScrollView来试试&#xff09; 2.上面的扫描图&#xff0c;肯定是个Vi…

Netty-4-网络编程模式

我们经常听到各种各样的概念——阻塞、非阻塞、同步、异步&#xff0c;这些概念都与我们采用的网络编程模式有关。 例如&#xff0c;如果采用BIO网络编程模式&#xff0c;那么程序就具有阻塞、同步等特质。 诸如此类&#xff0c;不同的网络编程模式具有不同的特点&#xff0c…

黎曼猜想被证明了?“他的证明甚至不能算是个错误”!阿蒂亚爵士的证明受到同行质疑...

作者&#xff1a;许琦敏 金婉霞编辑&#xff1a;金婉霞责任编辑&#xff1a;李雪林来源&#xff1a;解剖者摘要&#xff1a;德国柏林时间9月24日上午9点45分&#xff0c;菲尔兹奖与阿贝尔奖双料得主、英国皇家学会院士迈克尔阿蒂亚爵士在德国海德堡举行的海德堡奖诺贝尔奖获得者…

Android自定义View

1.View是什么&#xff1f; View是屏幕上的一块矩形区域&#xff0c;它负责用来显示一个区域&#xff0c;并且响应这个区域内的事件。可以说&#xff0c;手机屏幕上的任意一部分看的见得地方都是View&#xff0c;它很常见&#xff0c;比如 TextView 、ImageView 、Button以及Li…

【IT笔试面试题整理】判断链表是否存在环路,并找出回路起点

【试题描述】定义一个函数&#xff0c;输入一个链表&#xff0c;判断链表是否存在环路&#xff0c;并找出回路起点 Circular linked list: A (corrupt) linked list in which a node’s next pointer points to an earlier node, so as to make a loop in the linked listEXAMP…

腾讯机器人实验室首曝光 攻坚“通用人工智能”

来源&#xff1a;新浪科技摘要&#xff1a;与当初的“互联网”一样&#xff0c;“AI”正成为各行各业的标配。在近日召开的2018 世界人工智能大会上&#xff0c;腾讯董事会主席兼首席执行官马化腾提出&#xff0c;人工智能技术是一场跨国、跨学科的科学探索工程&#xff0c;对于…

Android之canvas详解

首先说一下canvas类&#xff1a; Class Overview The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into the bitmap), a drawing primitive (e…

下一代动力电池深度报告,三大技术路线谁能笑到最后?【附下载】| 智东西内参...

来源&#xff1a;智东西编辑&#xff1a;智东西内参摘要&#xff1a;随着全球电动车浪潮席卷&#xff0c;关于固态电池的新闻越来越多。从 Fisker 宣称开发充电 1 分钟行驶 500 公里的固态电池&#xff0c;到宝马已与 SolidPower 进行合作开发下一代电动车用固态电池&#xff0…

Android之shape属性详解

有时候 &#xff0c;为了满足一些需求&#xff0c;我们要用到 shape 去定义 一些背景&#xff0c;shape 的用法 跟图片一样 &#xff0c;可以给View设置 Android:background”drawable/shape”, 定义的shape 文件&#xff0c;放在 res/shape 目录下 通常我们可以用shape 做 bu…

S3C6410移植u-boot-2010.3(2)基本的启动信息修改

1、启动模块修改 进入/cpu/arm1176/目录&#xff0c;修改start.S文件 首先找到需要修改的CONFIG_NAND_SPL汇编原码&#xff0c;修改如下&#xff1a; #ifndef CONFIG_NAND_SPL /** flush v4 I/D caches*/ mov r0, #0 mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */ mcr p1…

[修订版]”大脑“爆发背后是50年互联网架构重大变革

前言&#xff1a;面对即将到来的2019年&#xff0c;互联网诞生50年将是诸多纪念活动中重要的一个&#xff0c;经过50年的发展&#xff0c;互联网究竟发生什么重要的变化&#xff0c;通过这篇文章试图进行一次总结&#xff0c;也提前向互联网50年致敬。作者&#xff1a;刘锋 互…

智慧城市建设:科技创业的下一个浪潮

来源&#xff1a;资本实验室随着全球城市化进程的加速&#xff0c;越来越多的人涌进城市&#xff0c;这为城市建设带来了一系列的挑战&#xff1a;一方面&#xff0c;城市需要面对大量的越来越老化的基础设施&#xff1b;另一方面&#xff0c;需要为新涌入的城市居民提供新的&a…

Android之ViewDragHelper

在自定义ViewGroup中&#xff0c;很多效果都包含用户手指去拖动其内部的某个View(eg:侧滑菜单等)&#xff0c;针对具体的需要去写好onInterceptTouchEvent和onTouchEvent这两个方法是一件很不容易的事&#xff0c;需要自己去处理&#xff1a;多手指的处理、加速度检测等等。 好…

DARPA人工智能技术研究情况一览

来源&#xff1a;一体化指挥调度国家工程实验室、高端装备发展研究中心摘要&#xff1a;20世纪60年代初&#xff0c;DARPA&#xff08;当时为ARPA&#xff09;开始介入自主技术研究&#xff0c;并很快成为该领域的主要研究机构。DARPA意识到&#xff0c;人工智能可以满足大量的…