【Android】【実質北海道一周】jsonを読み込ませる。

前回までの状況はこちら。

最新ソースはこちら(gitHub)

https://github.com/takishita2nd/AroundHokkaido

さて、前回作成したJsonファイルを、実際にAndroidアプリに読み込ませるのですが、

こちらの記事を参考にさせて頂きました。

https://qiita.com/Bluewind1997/items/c3f8e90e9fb19f47daee

assetsフォルダを作成して、その下にJsonファイルを作成して設置します。

あとはassetManagerを介せば、そのJsonファイルにアクセス出来ます。

ただ、assetManagerが使えるのはMainActivityだけ。

Androidのプログラミングでは、このMainActivityが重要でして、

Androidに関する重要な処理は、このMainActivityが無ければ使用できません。

なので、どこからでもMainActivityを使用できるように、シングルトンにしてしまえば良いのではと思いましたが、

Kotlinにはシングルトン(というか、staticクラス)という概念がないので、

ここだけJavaで書きました。

package com.takilab.aroundhokkaido;

import androidx.appcompat.app.AppCompatActivity;

public class SingletonActivity {
    private static AppCompatActivity _activity;

    public static void SetActivity(AppCompatActivity activity) {
        _activity = activity;
    }

    public static AppCompatActivity GetActivity(){
        return _activity;
    }
}

JavaとKotlinは混在できるんですね。

実際の開発現場では、どのようにMainActivityを扱っているんですかね?

このMainActivityを使ってJsonの読み出し。

package com.takilab.aroundhokkaido

class City(city: String, distance: Double) {
    val city: String = city
    val distance: Double = distance
}
package com.takilab.aroundhokkaido

import org.json.JSONException
import org.json.JSONObject
import java.io.BufferedReader
import java.io.InputStreamReader

class CityList {
    val cityList: ArrayList<City> = ArrayList()

    init{
        val activity: MainActivity = SingletonActivity.GetActivity() as MainActivity
        val assetManager = activity.resources.assets //アセット呼び出し
        val inputStream = assetManager.open("AroundHokkaido.json") //Jsonファイル
        val bufferedReader = BufferedReader(InputStreamReader(inputStream))
        val str: String = bufferedReader.readText() //データ
        try {
            val jsonObject = JSONObject(str)
            val jsonArray = jsonObject.getJSONArray("list")
            for (i in 0 until jsonArray.length()) {
                val jsonData = jsonArray.getJSONObject(i)
                val city: City = City(jsonData.getString("city"), jsonData.getDouble("distance"))
                cityList.add(city)
            }
        } catch (e: JSONException) {
            e.printStackTrace()
        }
    }
}
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        SingletonActivity.SetActivity(this);

        val cityList = CityList()
        for (city in cityList.cityList) {
            Log.d("Check", "${city.city} : ${city.distance}")
        }
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 札幌 : 35.9
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 小樽 : 20.1
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 余市 : 15.9
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 古平 : 6.4
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 積丹 : 49.0
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 神恵内 : 6.3
2020-08-07 09:02:07.564 6520-6520/com.takilab.aroundhokkaido D/Check: 泊 : 17.9
:
: