android小程序之幸运菜谱
android小程序之幸运菜谱
前言:刚刚结束短短5天的android公开课程,收获不少,写下来记录一下吧!(因为学校校企公开课的缘故才偶然接触的android,所以只学了这几天,不喜勿喷)
一开始得知这公开课最后得做个项目,还是挺懵逼的,不知道整啥。后来看了看聚合数据有啥免费的api,想了想寒假家里人老是问我今天吃啥,最后就有了做这个幸运菜谱的想法。
这app长啥样,下面这样:
第一张是主界面,输入你喜欢的一个数字(1-80000),然后就会在第二个界面返回对应的菜谱,你没看错(8万道菜,我一开始用这api的时候都惊呆了!)
接下来放上接口的代码和处理相应界面的java代码:
public class Juhedemo { //调用接口的代码
public static final String DEF_CHATSET = "UTF-8";
public static final int DEF_CONN_TIMEOUT = 30000;
public static final int DEF_READ_TIMEOUT = 30000;
public static String userAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36"; //配置您申请的KEY
public static final String APPKEY ="这就不能告诉你了,自己申请账号吧"; //4.按菜谱ID查看详细
public menubean getRequest4(String num){
menubean mu=new menubean();
String result =null;
String title,ingredient,burden;
ArrayList<String> b = new ArrayList<>();
String url ="http://apis.juhe.cn/cook/queryid";//请求接口地址
Map params = new HashMap();//请求参数
params.put("id",num);//菜谱的ID
params.put("key",APPKEY);//应用APPKEY(应用详细页查询)
params.put("dtype","json");//返回数据的格式,xml或json,默认json
Log.e("MyLog","====num===="+num);
try {
result =net(url, params, "GET");
Log.e("MyLog","====result===="+result);
org.json.JSONObject object = new org.json.JSONObject(result);
if(object.getInt("error_code")==0){
org.json.JSONObject resultObject = object.getJSONObject("result");
org.json.JSONArray array = resultObject.getJSONArray("data");
mu.setTitle(array.getJSONObject(0).getString("title"));
mu.setIngredient(array.getJSONObject(0).getString("ingredients"));
mu.setBurden(array.getJSONObject(0).getString("burden"));
org.json.JSONObject o1=array.getJSONObject(0);
org.json.JSONArray a1=o1.getJSONArray("steps");
for(int i=0;i<a1.length();i++){
String step =a1.getJSONObject(i).getString("step");
b.add(step);
}
mu.setB(b);
}
// JSONObject object = JSONObject.fromObject(result);
// Log.e("MyLog","=====object==="+object);
// JSONObject ob=object.getJSONObject("result");
// JSONArray ob1=ob.getJSONArray("data");
// JSONObject o2=ob1.getJSONObject(0);
// JSONArray po=o2.getJSONArray("steps");
//
// if(object.getInt("error_code")==0){
// title=o2.getString("title");
// ingredient=o2.getString("ingredients");
// burden=o2.getString("burden");
// for(int i=0;i<po.size();i++){
//
// JSONObject u=po.getJSONObject(i);
//
// b[i]=(u.getString("step"));
//
// }
// mu.setTitle(title);
// mu.setIngredient(ingredient);
// mu.setBurden(burden);
// mu.setB(b);
//
// }else{
// System.out.println(object.get("error_code")+":"+object.get("reason"));
//
// } } catch (Exception e) {
e.printStackTrace();
Log.e("MyLog","====+error_code===="+e.getMessage());
}
return mu;
} /**
*
* @param strUrl 请求地址
* @param params 请求参数
* @param method 请求方法
* @return 网络请求字符串
* @throws Exception
*/
public static String net(String strUrl, Map params,String method) throws Exception {
HttpURLConnection conn = null;
BufferedReader reader = null;
String rs = null;
try {
StringBuffer sb = new StringBuffer();
if(method==null || method.equals("GET")){
strUrl = strUrl+"?"+urlencode(params);
}
Log.e("MyLog","----url------"+strUrl);
URL url = new URL(strUrl);
conn = (HttpURLConnection) url.openConnection();
if(method==null || method.equals("GET")){
conn.setRequestMethod("GET");
}else{
conn.setRequestMethod("POST");
conn.setDoOutput(true);
}
conn.setRequestProperty("User-agent", userAgent);
conn.setUseCaches(false);
conn.setConnectTimeout(DEF_CONN_TIMEOUT);
conn.setReadTimeout(DEF_READ_TIMEOUT);
conn.setInstanceFollowRedirects(false);
conn.connect();
if (params!= null && method.equals("POST")) {
try {
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
out.writeBytes(urlencode(params));
} catch (Exception e) {
Log.e("MyLog","---- e------"+ e.getMessage());
}
}
InputStream is = conn.getInputStream();
rs = read(is);
// reader = new BufferedReader(new InputStreamReader(is));
// String strRead = null;
// while ((strRead = reader.readLine()) != null) {
// sb.append(strRead);
// }
// rs = sb.toString();
Log.e("MyLog","----rs------"+rs);
} catch (IOException e) {
Log.e("MyLog","----e------"+e.getMessage());
e.printStackTrace();
} finally {
if (reader != null) {
reader.close();
}
if (conn != null) {
conn.disconnect();
}
}
return rs;
} private static String read(InputStream is) throws IOException {
StringBuilder builder = new StringBuilder();
int byteCount = 0;
byte[] bytes = new byte[1024];
while ((byteCount = is.read(bytes)) != -1) {
String text = new String(bytes,0,byteCount);
Log.e("MyLog","----=======------"+ text);
builder.append(text);
}
Log.e("MyLog","----???????????------"+ builder.toString());
return builder.toString();
} //将map型转为请求参数型
public static String urlencode(Map<String,Object>data) {
StringBuilder sb = new StringBuilder();
for (Map.Entry i : data.entrySet()) {
try {
sb.append(i.getKey()).append("=").append(URLEncoder.encode(i.getValue()+"","UTF-8")).append("&");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return sb.toString();
}
}
这一部分当初遇到的问题是:我最初是用eclipse上调用接口测试的,一点问题都没有。后来把那部分代码放回到AS中就出问题了,总是数据获取不全,后来把json解析文件改了,就好了(上面注释部分就是之前的JSon解析代码)
public class MainActivity extends AppCompatActivity { //主界面
private EditText med;
private Button mb;
private List<Food> foodlist = new ArrayList<>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initFoods();
FoodAdapter adapter = new FoodAdapter(MainActivity.this,R.layout.food,foodlist);
med=findViewById(R.id.edit_text);
mb=findViewById(R.id.button);
mb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String num=med.getText().toString();
Intent in=new Intent(MainActivity.this,DetailActivity.class);
in.putExtra("med",num);
startActivity(in);
}
});
EditText editText = (EditText) findViewById(R.id.edit_text); ListView listView = (ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);
}
private void initFoods(){
Food a = new Food(R.drawable.food1);
foodlist.add(a);
Food b= new Food(R.drawable.food2);
foodlist.add(b);
Food c= new Food(R.drawable.food3);
foodlist.add(c); }
}
public class DetailActivity extends AppCompatActivity { //显示界面
private TextView tv,tv2,tv3,tv4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
tv=findViewById(R.id.tvTitle);
tv2=findViewById(R.id.tvIngredients);
tv3=findViewById(R.id.tvBunder);
tv4=findViewById(R.id.tvSteps);
Intent f= getIntent();
String ji=f.getStringExtra("med");
new NetworkTask().execute(ji); } private class NetworkTask extends AsyncTask<String,Void,menubean>{
@Override
protected menubean doInBackground(String... ji) { Juhedemo nu2=new Juhedemo();
menubean kk=nu2.getRequest4(ji[0]);
Log.e("MyLog","========"+kk);
// String title2=kk.getTitle();
return kk;
} @Override
protected void onPostExecute(menubean kk) {
ArrayList<String> ad=new ArrayList<String>();
String dg="";
ad=kk.getB();
for(int i=0;i<ad.size();i++){
dg=dg+ad.get(i);
} super.onPostExecute(kk);
tv.setText(kk.getTitle());
tv2.setText(kk.getIngredient());
tv3.setText(kk.getBurden());
tv4.setText(dg);
}
}
}
这就告一段落,接下来继续努力吧!(想知道自己幸运数字对应的是什么菜就给我留言,留下一个数字,我给你一道菜)
android小程序之幸运菜谱的更多相关文章
- android小程序-电子钢琴-多点触控
我在第一篇博客<android小程序-电子钢琴-滑动连续响应>中实现了一个简单地7键钢琴,这几天把它又完善了一下,增加了多点触控,按键也增加了一个低音区和一个高音区,使得又可以多弹一点简单 ...
- 微信小程序项目实战 - 菜谱大全
1. 项目简介 最近研究小程序云开发,上线了一个有关菜品查询的小程序.包括搜索.分享转发.收藏.查看历史记录等功能.菜谱 API 来自聚合数据.云开发为开发者提供完整的云端支持,弱化后端和运维概念,无 ...
- android小程序-电子钢琴-滑动连续响应
原创文字,转载请标明出处: 利用Button实现简单地电子钢琴,可以简单地响应按钮的click事件来发出相应的声音.但是这样不能达到手指在屏幕滑动,而连续发声的效果,就像手指在真实钢琴按键上滑过一样. ...
- 技术干货 | 轻松两步完成向 mPaaS 小程序传递启动参数
前言 在部分场景下,需要向小程序的默认接收页(pages/index/index)传递参数. 本文将以传递 name 和 pwd 参数为例,分别介绍此场景在 Android 小程序和 iOS 小程序中 ...
- 自学Android的第一个小程序(小布局、button点击事件、toast弹出)
因为上班,学习时间有限,昨晚才根据教程写了一个小程序,今天忙里偷闲写一下如何实现的,来加深一下印象. 首先创建一个Android项目, 通过activity_xxx.xml布局文件来添加组件来达到自己 ...
- 小程序员在android移动应用上的赚钱经历
先说说我自己吧,二线城市(以外包为主)的小程序员,工作多年了,月收入5-6K.主要从事asp.net web网站开发,java,c++,php,ruby都懂一些,属于那种对问题不求甚解型,爱好电脑游戏 ...
- android上instant app介绍 类似于微信小程序
android上instant app介绍 类似于微信小程序instant app 是谷歌推出的类似于微信小程序(或者说小程序类似于instant app)的一项技术,用户无须安装应用,用完就走,同时 ...
- 微信小程序windowHeight的值在ios和android平台不一致问题解决办法
开发中遇到一个业务需求,需要把页面顶部.底部固定,中间的scroll-view内部滚动.要满足这个需求,需要根据屏幕高度计算中间的scroll-view高度.结果悲催地发现,使用 wx.getSyst ...
- 微信小程序开发之IOS/Android兼容坑(持续更新)
一.时间转换问题: 这不只是小程序上面的问题是ios系统 都有这个问题就是new Date("2017-06-16") 在IOS会出现NAN的情况所以对于时间转换需要另行封装,解 ...
随机推荐
- python爬站长之家写一个信息搜集器
前言:不知道写什么好,绕来绕去还是写回爬虫这一块. 之前的都爬了一遍.这次爬点好用一点的网站. 0x01: 自行备好requests模块 目标站:http://tool.chinaz.com/ 0x2 ...
- NFS配置及使用
什么是NFS NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享存储.在NFS的应用中,本地NFS ...
- spring boot 使用java9上传到github其他人clone后报错
错误原因: Java.lang.NoClassDefFoundError:javax/xml/bind/JAXBException jdk9存在版本兼容问题. 经过查找资料发现问题所在 大致意思是ja ...
- python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型
一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...
- Java经典编程题50道之十四
输入某年某月某日,判断这一天是这一年的第几天? public class Example14 { public static void main(String[] args) { ...
- 安装git,gitlab和TortoiseGit
全部都是默认配置安装 需注册用户:用户名尽量好认 测试用户: 注册成功: 生成密钥: 1.首先使用TortoiseGit自带的Puttygen创建本地的公/私钥对 2.点击Generate按钮,在窗口 ...
- EmguCv“线段” 结构类型学习
1. 文件所在 Namespace: Emgu.CV.Structure Assembly: Emgu.CV (in Emgu.CV.dll) Version: 3.0.0.2157 (3.0.0.2 ...
- 《精通android网络开发》--HTTP数据通信
No1: 例如:http://www.*****.com/china/index.htm 1)http:// 代表超文本传送协议,通知*****.com服务器显示web页,通常不用输入 2)www 代 ...
- nyoj49 开心的小明 01背包
思路:dp(i, j)表示用金钱j去买前i个物品能得到的最大价值.转移方程dp(i, j) = max{dp(i-1, j), dp(i-1, j-p[i]) + p[i]*w[i]}. AC代码 # ...
- SpringBoot整合Mybatis,多数据源,事务,支持java -jar 启动.
用了一段时间SpringBoot,之前配置MYBATIS ,在打包WAR 放到tomcat下正常,但是WAR已经过时了,现在流行直接打包JAR 丢到DOCKER 里,无奈JAR 启动的时候MAPPER ...