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小程序之幸运菜谱的更多相关文章

  1. android小程序-电子钢琴-多点触控

    我在第一篇博客<android小程序-电子钢琴-滑动连续响应>中实现了一个简单地7键钢琴,这几天把它又完善了一下,增加了多点触控,按键也增加了一个低音区和一个高音区,使得又可以多弹一点简单 ...

  2. 微信小程序项目实战 - 菜谱大全

    1. 项目简介 最近研究小程序云开发,上线了一个有关菜品查询的小程序.包括搜索.分享转发.收藏.查看历史记录等功能.菜谱 API 来自聚合数据.云开发为开发者提供完整的云端支持,弱化后端和运维概念,无 ...

  3. android小程序-电子钢琴-滑动连续响应

    原创文字,转载请标明出处: 利用Button实现简单地电子钢琴,可以简单地响应按钮的click事件来发出相应的声音.但是这样不能达到手指在屏幕滑动,而连续发声的效果,就像手指在真实钢琴按键上滑过一样. ...

  4. 技术干货 | 轻松两步完成向 mPaaS 小程序传递启动参数

    前言 在部分场景下,需要向小程序的默认接收页(pages/index/index)传递参数. 本文将以传递 name 和 pwd 参数为例,分别介绍此场景在 Android 小程序和 iOS 小程序中 ...

  5. 自学Android的第一个小程序(小布局、button点击事件、toast弹出)

    因为上班,学习时间有限,昨晚才根据教程写了一个小程序,今天忙里偷闲写一下如何实现的,来加深一下印象. 首先创建一个Android项目, 通过activity_xxx.xml布局文件来添加组件来达到自己 ...

  6. 小程序员在android移动应用上的赚钱经历

    先说说我自己吧,二线城市(以外包为主)的小程序员,工作多年了,月收入5-6K.主要从事asp.net web网站开发,java,c++,php,ruby都懂一些,属于那种对问题不求甚解型,爱好电脑游戏 ...

  7. android上instant app介绍 类似于微信小程序

    android上instant app介绍 类似于微信小程序instant app 是谷歌推出的类似于微信小程序(或者说小程序类似于instant app)的一项技术,用户无须安装应用,用完就走,同时 ...

  8. 微信小程序windowHeight的值在ios和android平台不一致问题解决办法

    开发中遇到一个业务需求,需要把页面顶部.底部固定,中间的scroll-view内部滚动.要满足这个需求,需要根据屏幕高度计算中间的scroll-view高度.结果悲催地发现,使用 wx.getSyst ...

  9. 微信小程序开发之IOS/Android兼容坑(持续更新)

    一.时间转换问题: 这不只是小程序上面的问题是ios系统 都有这个问题就是new  Date("2017-06-16") 在IOS会出现NAN的情况所以对于时间转换需要另行封装,解 ...

随机推荐

  1. Trie树/字典树题目(2017今日头条笔试题:异或)

    /* 本程序说明: [编程题] 异或 时间限制:1秒 空间限制:32768K 给定整数m以及n个数字A1,A2,..An,将数列A中所有元素两两异或,共能得到n(n-1)/2个结果,请求出这些结果中大 ...

  2. 在CentOS 6.x上配合Windows客户端搭建 git(gitosis)服务器

    一.在 CentOS 上安装 git 和 gitosis: 逐条执行如下语句: sudo yum install git python-setuptools cd /opt sudo git clon ...

  3. [Python Study Notes]CS架构远程访问获取信息--Client端v2.0

    更新内容: 1.增加内存信息获取 2.增加电池信息获取 3.增加磁盘信息获取 4.重新布局窗体 5.增加窗体名称 6.增加连接成功之前,不可按压 效果图: '''''''''''''''''''''' ...

  4. JS原生Ajax&Jquery的Ajax技术&Json

    1.介绍Ajax Ajax = 异步 JavaScript 和 XML Ajax是一种创建快速动态网页的技术 通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新.这意味着可以不用整个 ...

  5. js在工作中遇到的一些问题

    前言 js这种语言没有太多封装好的模式或者统一的编程方式,所以一些细节的问题很容易导致bug,那下面就写为:一份坚固的代码是什么样的. 持续更新一下,记一些good case和bug. 事件绑定的选择 ...

  6. 如何在 window7 环境编译 zlib 库?

    1.下载最新版本 zlib 库 `下载地址:http://www.zlib.net/ 2.打开vc14项目 解压下载的 zlib.zip 压缩包并打开zlib1211\zlib-1.2.11\cont ...

  7. OpenStack中memcached的使用和实现

    概述 主要分享下个人对Liberty版本openstack中cache使用的理解,由于作者水平有限,难免有所错误,疏漏,还望批评指正. openstack中可以使用cache层来缓存数据,Libert ...

  8. SpringCloud @FeignClient的类注解@ReqestMapping无效报错:No message available","path":"/xxxx

    最近在使用Feign组合微服务的时候发现在@FeignClient接口类上使用@ReqestMapping无效. 像下面的这个代码: @FeignClient("xxx") @Re ...

  9. 文本处理三剑客之grep&正则表达式

    grep是一个文本过滤工具,它支持正则表达式,能把搜索匹配到的行打印出来.grep的全称是Global Regular Expression Print(全局正则表达式)使用权限是所有用户. 一.gr ...

  10. Hama顶点编程

    Hama是基于HDFS上的BSP模型实现. Apache Hame是Google Pregel的开源实现 Pregel是Google提出的一个面向大规模图计算的通用编程模型.许多实际应用中都涉及到大型 ...