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的情况所以对于时间转换需要另行封装,解 ...
随机推荐
- B 洛谷 P3604 美好的每一天 [莫队算法]
题目背景 时间限制3s,空间限制162MB 素晴らしき日々 我们的情人,不过是随便借个名字,用幻想吹出来的肥皂泡,把信拿去吧,你可以使假戏成真.我本来是无病呻吟,漫无目的的吐露爱情---现在这些漂泊不 ...
- BZOJ 2329: [HNOI2011]括号修复 [splay 括号]
题目描述 一个合法的括号序列是这样定义的: 空串是合法的. 如果字符串 S 是合法的,则(S)也是合法的. 如果字符串 A 和 B 是合法的,则 AB 也是合法的. 现在给你一个长度为 N 的由‘(' ...
- 如何使用JS实现banner图滚动
通过JS实现banner图的滚动主要是定时器的应用 先新建好banner图的几张图片,最后一张与第一张用同一个,保证滚动的不间断 改好样式,需注意所有图片要在同行显示,否则不能向左滚动 声明一个函数, ...
- 如何用JavaScript制作循环图形
[图题思路] 1.确定图形一共几行,即为外层的循环的次数 2.确定每行有几种元素,代表有几个内层循环 3.确定每种元素的个数,即为每个内层循环的次数Tips:通常,找出每种元 ...
- XSD详解三 - 复合元素+总结篇
一.复合元素介绍 1.什么是复合元素? 复合元素指包含其他元素及/或属性的 XML 元素. 有四种类型的复合元素: 空元素 包含其他元素的元素 仅包含文本的元素 包含元素和文本的元素 注释:上述元素均 ...
- Orleans之EventSourcing
Orleans之EventSourcing 这是Orleans系列文章中的一篇.首篇文章在此 引入: 如果没有意外,我再这篇文章中用ES代替EventSourcing,如果碰到"事件回溯&q ...
- [Python Study Notes]列表操作
列表操作 a.切片 >>> names = ["Alex","Tenglan","Eric","Rain&quo ...
- php生成文字水印和图片水印
生成文字水印 //文字水印 /*打开图片*/ //1.配置图片路径 $src = "4.jpg"; //2.获取图片的信息(得到图片的基本信息) $info = getimag ...
- MySQL select语句直接导出数据
select * into outfile '文件存放路径' from 表名; (先记下来,还未测试)
- Tomcat输出保存JVM GC日志文件
当系统出现问题时,分析java虚拟机GC日志可以帮助我们定位问题,一般来说, 我们可以通过制定JVM参数使tomcat保存GC日志文件,具体实现如下: Windows下: 找到tomcat的解压目录, ...