在线汇率转换,用json解析数据,支持偏好设置。

默认启动Activity背景是一张图片,启动时后台加载汇率数据,加载成功后进入另一个与用户交互Activity

这里写图片描述
这里写图片描述

首先分析JsonParser代码

package com.example.zhaorunze.currencies;

import android.util.Log;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

/**
 * Created by zhaorunze on 2017/4/3.
 */
public class JSONParser {
   // static InputStream sInputStream=null;
    private static JSONObject sReturnJsonObject=null;
    private static String sRwaJsonString=null;

    public JSONObject getsReturnJsonObject(String url) {
        StringBuilder sb = new StringBuilder();
        try {
            URL urlObject = new URL(url);
            URLConnection uc = urlObject.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream(),"iso-8859-1"));
            String inputLine = null;
            while ((inputLine = in.readLine()) != null) {
                sb.append(inputLine);
            }
            in.close();
            sRwaJsonString=sb.toString();
        }
        //catch (MalformedURLException e) {
        // e.printStackTrace();
       // }
        catch (IOException e) {
            e.printStackTrace();
        }
        //read stream into string-builder
        try {
            sReturnJsonObject=new JSONObject(sRwaJsonString);
        }catch (JSONException e){
            Log.e("Parser","Error when parsing data"+e.toString());
        }
        return sReturnJsonObject;
    }
}

1.从url中读取数据流存到BufferedReader。
2.从BufferedReader 中按行读取添加(每次从字符末尾开始添加)到StringBuilder 中 。
3.再把StringBuilder 转换成字符串sRwaJsonString。
4.最后用字符串作为参数,实例化JSONObject。

设置偏好,重启时自动打开上次保存的一组转换对象。

package com.example.zhaorunze.currencies;

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

/**
 * Created by zhaorunze on 2017/4/6.
 */
public class PrefsMgr {
    private static SharedPreferences sShredPreferences;
    public static void setString(Context context,String locale,String code){
        sShredPreferences= PreferenceManager.getDefaultSharedPreferences(context);
        SharedPreferences.Editor editor=sShredPreferences.edit();
        editor.putString(locale,code);
        editor.commit();
    }
    public static String getString(Context context,String locale){
        sShredPreferences=PreferenceManager.getDefaultSharedPreferences(context);
        return sShredPreferences.getString(locale,null);
    }
}

SharedPreferences是Android平台上一个轻量级的存储类,简单的说就是可以存储一些我们需要的变量信息。
2个activity 之间的数据传递除了可以他通过intent来传递,还可以使用SharedPreferences来共享数据的方式

SharedPreferences负责根据key读取数据,而SharedPreferences.Editor则用写入数据。

这个是默认启动Activity,后台异步线程加载数据。

package com.example.zhaorunze.currencies;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Window;
import android.widget.Toast;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.Iterator;

public class SplashActivity extends Activity {

    public static final String URL_CODES = "http://openexchangerates.org/api/currencies.json";
    public static final String KEY_ARRAYLIST = "key_arraylist";
    private ArrayList<String> mCurrencies;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_splash);
        new FetchCodesTask().execute(URL_CODES);
    }

    private class FetchCodesTask extends AsyncTask<String, Void, JSONObject> {

        @Override
        protected JSONObject doInBackground(String... params) {
            return new JSONParser().getsReturnJsonObject(params[0]);
        }

        @Override
        protected void onPostExecute(JSONObject jsonObject) {
            //super.onPostExecute(jsonObject);
            try {
                if (jsonObject == null) {
                       throw new JSONException("no data available.");
                }
                Iterator iterator=jsonObject.keys();
                String key="";
                mCurrencies=new ArrayList<String>();
                while(iterator.hasNext()){
                    key=(String)iterator.next();
                    mCurrencies.add(key+"|"+jsonObject.getString(key));

                }
                Intent mainIntent=new Intent(SplashActivity.this,MainActivity.class);
                mainIntent.putExtra(KEY_ARRAYLIST,mCurrencies);
                startActivity(mainIntent);
                finish();
            }catch (JSONException e){
                Toast.makeText(
                        SplashActivity.this,
                        "There is been a JSON exception:"+e.getMessage(),
                        Toast.LENGTH_LONG
                ).show();
                e.printStackTrace();
                finish();
            }
        }
    }
}

doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
onPostExecute(Result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回

SplashActivity执行异步任务,从URL_CODES中,用JsonParser解析数据,用Iterator遍历jsonObject.keys中的key(存储方式类似map),通过key获取value。把获取到的值按key|value形式存到Arraylist中,用intent传到UIActivity。

最后UIActivity中给calculate按钮设置监听,按钮被点击时,执行AsyncTask任务,获取那一时刻的数据,然后执行转换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<option value="AED">United Arab Emirates Dirham (AED)</option> <option value="ANG">Netherlands Antillean Guilder (ANG)</option> <option value="ARS">Argentine Peso (ARS)</option> <option value="AUD">Australian Dollar (AUD)</option> <option value="BDT">Bangladeshi Taka (BDT)</option> <option value="BGN">Bulgarian Lev (BGN)</option> <option value="BHD">Bahraini Dinar (BHD)</option> <option value="BND">Brunei Dollar (BND)</option> <option value="BOB">Bolivian Boliviano (BOB)</option> <option value="BRL">Brazilian Real (BRL)</option> <option value="BWP">Botswanan Pula (BWP)</option> <option value="CAD">Canadian Dollar (CAD)</option> <option value="CHF">Swiss Franc (CHF)</option> <option value="CLP">Chilean Peso (CLP)</option> <option value="CNY">Chinese Yuan (CNY)</option> <option value="COP">Colombian Peso (COP)</option> <option value="CRC">Costa Rican Colón (CRC)</option> <option value="CZK">Czech Republic Koruna (CZK)</option> <option value="DKK">Danish Krone (DKK)</option> <option value="DOP">Dominican Peso (DOP)</option> <option value="DZD">Algerian Dinar (DZD)</option> <option value="EEK">Estonian Kroon (EEK)</option> <option value="EGP">Egyptian Pound (EGP)</option> <option value="EUR">Euro (EUR)</option> <option value="FJD">Fijian Dollar (FJD)</option> <option value="GBP">British Pound Sterling (GBP)</option> <option value="HKD">Hong Kong Dollar (HKD)</option> <option value="HNL">Honduran Lempira (HNL)</option> <option value="HRK">Croatian Kuna (HRK)</option> <option value="HUF">Hungarian Forint (HUF)</option> <option value="IDR">Indonesian Rupiah (IDR)</option> <option value="ILS">Israeli New Sheqel (ILS)</option> <option value="INR">Indian Rupee (INR)</option> <option value="JMD">Jamaican Dollar (JMD)</option> <option value="JOD">Jordanian Dinar (JOD)</option> <option value="JPY">Japanese Yen (JPY)</option> <option value="KES">Kenyan Shilling (KES)</option> <option value="KRW">South Korean Won (KRW)</option> <option value="KWD">Kuwaiti Dinar (KWD)</option> <option value="KYD">Cayman Islands Dollar (KYD)</option> <option value="KZT">Kazakhstani Tenge (KZT)</option> <option value="LBP">Lebanese Pound (LBP)</option> <option value="LKR">Sri Lankan Rupee (LKR)</option> <option value="LTL">Lithuanian Litas (LTL)</option> <option value="LVL">Latvian Lats (LVL)</option> <option value="MAD">Moroccan Dirham (MAD)</option> <option value="MDL">Moldovan Leu (MDL)</option> <option value="MKD">Macedonian Denar (MKD)</option> <option value="MUR">Mauritian Rupee (MUR)</option> <option value="MVR">Maldivian Rufiyaa (MVR)</option> <option value="MXN">Mexican Peso (MXN)</option> <option value="MYR">Malaysian Ringgit (MYR)</option> <option value="NAD">Namibian Dollar (NAD)</option> <option value="NGN">Nigerian Naira (NGN)</option> <option value="NIO">Nicaraguan Córdoba (NIO)</option> <option value="NOK">Norwegian Krone (NOK)</option> <option value="NPR">Nepalese Rupee (NPR)</option> <option value="NZD">New Zealand Dollar (NZD)</option> <option value="OMR">Omani Rial (OMR)</option> <option value="PEN">Peruvian Nuevo Sol (PEN)</option> <option value="PGK">Papua New Guinean Kina (PGK)</option> <option value="PHP">Philippine Peso (PHP)</option> <option value="PKR">Pakistani Rupee (PKR)</option> <option value="PLN">Polish Zloty (PLN)</option> <option value="PYG">Paraguayan Guarani (PYG)</option> <option value="QAR">Qatari Rial (QAR)</option> <option value="RON">Romanian Leu (RON)</option> <option value="RSD">Serbian Dinar (RSD)</option> <option value="RUB">Russian Ruble (RUB)</option> <option value="SAR">Saudi Riyal (SAR)</option> <option value="SCR">Seychellois Rupee (SCR)</option> <option value="SEK">Swedish Krona (SEK)</option> <option value="SGD">Singapore Dollar (SGD)</option> <option value="SKK">Slovak Koruna (SKK)</option> <option value="SLL">Sierra Leonean Leone (SLL)</option>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值