{"id":1474,"date":"2025-06-02T06:11:08","date_gmt":"2025-06-01T21:11:08","guid":{"rendered":"https:\/\/itstudy365.com\/blog\/?p=1474"},"modified":"2025-06-02T06:11:08","modified_gmt":"2025-06-01T21:11:08","slug":"android-application-development-%e7%ac%ac33%e7%ab%a0%ef%bc%9a%e5%ae%9f%e8%b7%b5%e3%83%9f%e3%83%8b%e3%82%a2%e3%83%97%e3%83%aa%ef%bc%9a%e5%a4%a9%e6%b0%97%e6%83%85%e5%a0%b1%e3%82%a2%e3%83%97%e3%83%aa","status":"publish","type":"post","link":"https:\/\/itstudy365.com\/blog\/2025\/06\/02\/android-application-development-%e7%ac%ac33%e7%ab%a0%ef%bc%9a%e5%ae%9f%e8%b7%b5%e3%83%9f%e3%83%8b%e3%82%a2%e3%83%97%e3%83%aa%ef%bc%9a%e5%a4%a9%e6%b0%97%e6%83%85%e5%a0%b1%e3%82%a2%e3%83%97%e3%83%aa\/","title":{"rendered":"Android application development \u7b2c33\u7ae0\uff1a\u5b9f\u8df5\u30df\u30cb\u30a2\u30d7\u30ea\uff1a\u5929\u6c17\u60c5\u5831\u30a2\u30d7\u30ea"},"content":{"rendered":"\n<button id=\"bb1\" type=\"button\" value=\"Play\" class=\"responsivevoice-button\" title=\"ResponsiveVoice Tap to Start\/Stop Speech\"><span>&#128266; Play<\/span><\/button>\n        <script>\n            bb1.onclick = function(){\n                if(responsiveVoice.isPlaying()){\n                    responsiveVoice.cancel();\n                }else{\n                    responsiveVoice.speak(\"\ud83c\udfaf \u3053\u306e\u7ae0\u306e\u76ee\u7684 \u300c\u5929\u6c17\u60c5\u5831\u30a2\u30d7\u30ea\u300d\u3068\u3044\u3046\u5b9f\u7528\u7684\u306a\u984c\u6750\u3092\u901a\u3058\u3066\u3001\u6b21\u306e\u6280\u8853\u8981\u7d20\u3092\u7406\u89e3\u30fb\u4f53\u9a13\u3057\u307e\u3059\uff1a \u6280\u8853\u8981\u7d20\u5b66\u7fd2\u5185\u5bb9RetrofitHTTP\u901a\u4fe1\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9GsonJSON\u3092Java\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3078\u30d1\u30fc\u30b9ViewModelUI\u3068\u30ed\u30b8\u30c3\u30af\u306e\u5206\u96e2LiveDataUI\u3078\u306e\u975e\u540c\u671f\u30c7\u30fc\u30bf\u53cd\u6620\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u901a\u4fe1\u5931\u6557\u3084API\u7570\u5e38\u6642\u306e\u5bfe\u5fdc \ud83c\udf24 \u30a2\u30d7\u30ea\u306e\u69cb\u6210 \u753b\u9762\uff1a\u90fd\u5e02\u540d\u3092\u5165\u529b \u2192 \u691c\u7d22\u30dc\u30bf\u30f3 \u2192 \u5929\u6c17\u60c5\u5831\u3092\u8868\u793a \u30c7\u30fc\u30bf\u53d6\u5f97\uff1aOpenWeatherMap API\u306a\u3069\u3092\u547c\u3073\u51fa\u3057 \u69cb\u6210\u8981\u7d20\uff1a MainActivity\uff1aUI\u3092\u7ba1\u7406 WeatherViewModel\uff1aUI\u3068\u30c7\u30fc\u30bf\u53d6\u5f97\u51e6\u7406\u3092\u3064\u306a\u3050 WeatherRepository\uff1aAPI\u547c\u3073\u51fa\u3057\u3068\u7d50\u679c\u6574\u5f62 RetrofitService\uff1aAPI\u901a\u4fe1\u5b9a\u7fa9 Gson\uff1aJSON\u3092Java\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3078\u5909\u63db \ud83e\udde9 Retrofit\u3092\u7528\u3044\u305fAPI\u901a\u4fe1 Step 1\uff1aRetrofit\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u306e\u5b9a\u7fa9 public interface WeatherApiService { @GET(\\\"weather\\\") Callless thanWeatherResponsegreater than getWeather( @Query(\\\"q\\\") String cityName, @Query(\\\"appid\\\") String apiKey, @Query(\\\"units\\\") String units ); } Step 2\uff1aRetrofit\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u4f5c\u6210 Retrofit retrofit = new Retrofit.Builder() .baseUrl(\\\"https:\/\/api.openweathermap.org\/data\/2.5\/\\\") .addConverterFactory(GsonConverterFactory.create()) .build(); WeatherApiService service = retrofit.create(WeatherApiService.class); \u2601 JSON\u30d1\u30fc\u30b9\uff08Gson\uff09 Retrofit\u3068\u7d44\u307f\u5408\u308f\u305b\u3066\u3001JSON\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u81ea\u52d5\u3067Java\u30af\u30e9\u30b9\u306b\u5909\u63db\u3057\u307e\u3059\u3002 { \\\"weather\\\": [ { \\\"main\\\": \\\"Clear\\\", \\\"description\\\": \\\"clear sky\\\" } ], \\\"main\\\": { \\\"temp\\\": 27.5 } } \u305d\u308c\u306b\u5bfe\u5fdc\u3059\u308bJava\u30af\u30e9\u30b9\uff1a public class WeatherResponse { public Listless thanWeathergreater than weather; public Main main; public static class Weather { public String main; public String description; } public static class Main { public float temp; } } \ud83e\udde0 ViewModel\u306e\u6d3b\u7528 ViewModel\u3067\u975e\u540c\u671f\u51e6\u7406\u3092\u6271\u3044\u3001UI\u3068\u306e\u5206\u96e2\u3092\u5b9f\u73fe\u3057\u307e\u3059\u3002 public class WeatherViewModel extends ViewModel { private final MutableLiveDataless thanWeatherResponsegreater than weatherData = new MutableLiveDataless thangreater than(); private final MutableLiveDataless thanStringgreater than error = new MutableLiveDataless thangreater than(); public void fetchWeather(String city) { WeatherApiService service = RetrofitClient.getInstance().create(WeatherApiService.class); service.getWeather(city, \\\"your_api_key\\\", \\\"metric\\\").enqueue(new Callbackless thangreater than() { @Override public void onResponse(Callless thanWeatherResponsegreater than call, Responseless thanWeatherResponsegreater than response) { if (response.isSuccessful()) { weatherData.postValue(response.body()); } else { error.postValue(\\\"\u90fd\u5e02\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\\\"); } } @Override public void onFailure(Callless thanWeatherResponsegreater than call, Throwable t) { error.postValue(\\\"\u901a\u4fe1\u306b\u5931\u6557\u3057\u307e\u3057\u305f\uff1a\\\" + t.getMessage()); } }); } public LiveDataless thanWeatherResponsegreater than getWeatherData() { return weatherData; } public LiveDataless thanStringgreater than getError() { return error; } } \ud83c\udf9b MainActivity\u306eUI\u9023\u643a\u4f8b viewModel.getWeatherData().observe(this, data -greater than { tempText.setText(data.main.temp + \\\"\u00b0C\\\"); descText.setText(data.weather.get(0).description); }); viewModel.getError().observe(this, errorMsg -greater than { Toast.makeText(this, errorMsg, Toast.LENGTH_SHORT).show(); }); \ud83d\udea8 \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u30dd\u30a4\u30f3\u30c8 \u30b1\u30fc\u30b9\u5bfe\u5fdc\u65b9\u6cd5\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u63a5\u7d9a\u30a8\u30e9\u30fconFailure() \u3067\u691c\u77e5\u3057\u3001\u30e6\u30fc\u30b6\u30fc\u306b\u901a\u77e5API\u30ec\u30b9\u30dd\u30f3\u30b9\u304c404response.isSuccessful() \u3067\u691c\u77e5\u3057\u3001\u30e1\u30c3\u30bb\u30fc\u30b8\u8868\u793aJSON\u69cb\u9020\u5909\u66f4Gson\u3067\u306e\u30de\u30c3\u30d4\u30f3\u30b0\u5931\u6557\u306b\u5099\u3048\u3066\u4f8b\u5916\u88dc\u8db3 \ud83d\udd04 \u5168\u4f53\u306e\u6d41\u308c\uff08\u56f3\u89e3\uff09 \ud83d\udca1 \u307e\u3068\u3081 \u3053\u306e\u30df\u30cb\u30a2\u30d7\u30ea\u3067\u306f\u3001\u6b21\u306e\u3088\u3046\u306a\u91cd\u8981\u306aAndroid\u958b\u767a\u30b9\u30ad\u30eb\u3092\u5b66\u3073\u307e\u3059\uff1a HTTP\u901a\u4fe1\uff08\u975e\u540c\u671f\uff09\u306e\u5b9f\u88c5 JSON \u2192 Java\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u5909\u63db\uff08Gson\uff09 UI\u3068\u30ed\u30b8\u30c3\u30af\u306e\u5206\u96e2\uff08ViewModel\uff09 \u30a8\u30e9\u30fc\u6642\u306e\u30e6\u30fc\u30b6\u30fc\u5bfe\u5fdc Java\u30a8\u30f3\u30b8\u30cb\u30a2\u306e\u8996\u70b9\u304b\u3089\u3059\u308b\u3068\u3001Retrofit\u306f\u300cJAX-RS + Jackson\u300d\u306e\u3088\u3046\u306a\u5f79\u5272\u3092\u679c\u305f\u3057\u3066\u304a\u308a\u3001ViewModel\u306fMVC\u306eController\u306b\u8fd1\u3044\u611f\u899a\u3067\u3059\u3002\u3057\u304b\u3057\u3001\u975e\u540c\u671f\u6027\u3084\u30e9\u30a4\u30d5\u30b5\u30a4\u30af\u30eb\u5bfe\u5fdc\u306e\u70b9\u3067\u3001Android\u306a\u3089\u3067\u306f\u306e\u30a2\u30d7\u30ed\u30fc\u30c1\u3092\u53d6\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\", \"Japanese Female\");\n                }\n            };\n        <\/script>\n    <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udfaf \u3053\u306e\u7ae0\u306e\u76ee\u7684<\/h2>\n\n\n\n<p>\u300c\u5929\u6c17\u60c5\u5831\u30a2\u30d7\u30ea\u300d\u3068\u3044\u3046\u5b9f\u7528\u7684\u306a\u984c\u6750\u3092\u901a\u3058\u3066\u3001\u6b21\u306e\u6280\u8853\u8981\u7d20\u3092\u7406\u89e3\u30fb\u4f53\u9a13\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u6280\u8853\u8981\u7d20<\/th><th>\u5b66\u7fd2\u5185\u5bb9<\/th><\/tr><\/thead><tbody><tr><td>Retrofit<\/td><td>HTTP\u901a\u4fe1\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9<\/td><\/tr><tr><td>Gson<\/td><td>JSON\u3092Java\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3078\u30d1\u30fc\u30b9<\/td><\/tr><tr><td>ViewModel<\/td><td>UI\u3068\u30ed\u30b8\u30c3\u30af\u306e\u5206\u96e2<\/td><\/tr><tr><td>LiveData<\/td><td>UI\u3078\u306e\u975e\u540c\u671f\u30c7\u30fc\u30bf\u53cd\u6620<\/td><\/tr><tr><td>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/td><td>\u901a\u4fe1\u5931\u6557\u3084API\u7570\u5e38\u6642\u306e\u5bfe\u5fdc<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udf24 \u30a2\u30d7\u30ea\u306e\u69cb\u6210<\/h2>\n\n\n\n<ul>\n<li><strong>\u753b\u9762<\/strong>\uff1a\u90fd\u5e02\u540d\u3092\u5165\u529b \u2192 \u691c\u7d22\u30dc\u30bf\u30f3 \u2192 \u5929\u6c17\u60c5\u5831\u3092\u8868\u793a<\/li>\n\n\n\n<li><strong>\u30c7\u30fc\u30bf\u53d6\u5f97<\/strong>\uff1aOpenWeatherMap API\u306a\u3069\u3092\u547c\u3073\u51fa\u3057<\/li>\n\n\n\n<li><strong>\u69cb\u6210\u8981\u7d20<\/strong>\uff1a\n<ul>\n<li><code>MainActivity<\/code>\uff1aUI\u3092\u7ba1\u7406<\/li>\n\n\n\n<li><code>WeatherViewModel<\/code>\uff1aUI\u3068\u30c7\u30fc\u30bf\u53d6\u5f97\u51e6\u7406\u3092\u3064\u306a\u3050<\/li>\n\n\n\n<li><code>WeatherRepository<\/code>\uff1aAPI\u547c\u3073\u51fa\u3057\u3068\u7d50\u679c\u6574\u5f62<\/li>\n\n\n\n<li><code>RetrofitService<\/code>\uff1aAPI\u901a\u4fe1\u5b9a\u7fa9<\/li>\n\n\n\n<li><code>Gson<\/code>\uff1aJSON\u3092Java\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3078\u5909\u63db<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udde9 Retrofit\u3092\u7528\u3044\u305fAPI\u901a\u4fe1<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1\uff1aRetrofit\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u306e\u5b9a\u7fa9<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-csharp\" data-lang=\"C#\" data-show-lang=\"0\"><code>public interface WeatherApiService {\n    @GET(&quot;weather&quot;)\n    Call&lt;WeatherResponse&gt; getWeather(\n        @Query(&quot;q&quot;) String cityName,\n        @Query(&quot;appid&quot;) String apiKey,\n        @Query(&quot;units&quot;) String units\n    );\n}<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2\uff1aRetrofit\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u4f5c\u6210<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-csharp\" data-lang=\"C#\" data-show-lang=\"0\"><code>Retrofit retrofit = new Retrofit.Builder()\n    .baseUrl(&quot;https:\/\/api.openweathermap.org\/data\/2.5\/&quot;)\n    .addConverterFactory(GsonConverterFactory.create())\n    .build();\n\nWeatherApiService service = retrofit.create(WeatherApiService.class);<\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2601 JSON\u30d1\u30fc\u30b9\uff08Gson\uff09<\/h2>\n\n\n\n<p>Retrofit\u3068\u7d44\u307f\u5408\u308f\u305b\u3066\u3001JSON\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u81ea\u52d5\u3067Java\u30af\u30e9\u30b9\u306b\u5909\u63db\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-json\" data-lang=\"JSON\" data-show-lang=\"0\"><code>{\n  &quot;weather&quot;: [ { &quot;main&quot;: &quot;Clear&quot;, &quot;description&quot;: &quot;clear sky&quot; } ],\n  &quot;main&quot;: { &quot;temp&quot;: 27.5 }\n}<\/code><\/pre><\/div>\n\n\n\n<p>\u305d\u308c\u306b\u5bfe\u5fdc\u3059\u308bJava\u30af\u30e9\u30b9\uff1a<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-csharp\" data-lang=\"C#\" data-show-lang=\"0\"><code>public class WeatherResponse {\n    public List&lt;Weather&gt; weather;\n    public Main main;\n\n    public static class Weather {\n        public String main;\n        public String description;\n    }\n\n    public static class Main {\n        public float temp;\n    }\n}<\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udde0 ViewModel\u306e\u6d3b\u7528<\/h2>\n\n\n\n<p>ViewModel\u3067\u975e\u540c\u671f\u51e6\u7406\u3092\u6271\u3044\u3001UI\u3068\u306e\u5206\u96e2\u3092\u5b9f\u73fe\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-csharp\" data-lang=\"C#\" data-show-lang=\"0\"><code>public class WeatherViewModel extends ViewModel {\n    private final MutableLiveData&lt;WeatherResponse&gt; weatherData = new MutableLiveData&lt;&gt;();\n    private final MutableLiveData&lt;String&gt; error = new MutableLiveData&lt;&gt;();\n\n    public void fetchWeather(String city) {\n        WeatherApiService service = RetrofitClient.getInstance().create(WeatherApiService.class);\n        service.getWeather(city, &quot;your_api_key&quot;, &quot;metric&quot;).enqueue(new Callback&lt;&gt;() {\n            @Override\n            public void onResponse(Call&lt;WeatherResponse&gt; call, Response&lt;WeatherResponse&gt; response) {\n                if (response.isSuccessful()) {\n                    weatherData.postValue(response.body());\n                } else {\n                    error.postValue(&quot;\u90fd\u5e02\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093&quot;);\n                }\n            }\n\n            @Override\n            public void onFailure(Call&lt;WeatherResponse&gt; call, Throwable t) {\n                error.postValue(&quot;\u901a\u4fe1\u306b\u5931\u6557\u3057\u307e\u3057\u305f\uff1a&quot; + t.getMessage());\n            }\n        });\n    }\n\n    public LiveData&lt;WeatherResponse&gt; getWeatherData() { return weatherData; }\n    public LiveData&lt;String&gt; getError() { return error; }\n}\n<\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udf9b MainActivity\u306eUI\u9023\u643a\u4f8b<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-csharp\" data-lang=\"C#\" data-show-lang=\"0\"><code>viewModel.getWeatherData().observe(this, data -&gt; {\n    tempText.setText(data.main.temp + &quot;\u00b0C&quot;);\n    descText.setText(data.weather.get(0).description);\n});\n\nviewModel.getError().observe(this, errorMsg -&gt; {\n    Toast.makeText(this, errorMsg, Toast.LENGTH_SHORT).show();\n});<\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udea8 \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u30dd\u30a4\u30f3\u30c8<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u30b1\u30fc\u30b9<\/th><th>\u5bfe\u5fdc\u65b9\u6cd5<\/th><\/tr><\/thead><tbody><tr><td>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u63a5\u7d9a\u30a8\u30e9\u30fc<\/td><td><code>onFailure()<\/code> \u3067\u691c\u77e5\u3057\u3001\u30e6\u30fc\u30b6\u30fc\u306b\u901a\u77e5<\/td><\/tr><tr><td>API\u30ec\u30b9\u30dd\u30f3\u30b9\u304c404<\/td><td><code>response.isSuccessful()<\/code> \u3067\u691c\u77e5\u3057\u3001\u30e1\u30c3\u30bb\u30fc\u30b8\u8868\u793a<\/td><\/tr><tr><td>JSON\u69cb\u9020\u5909\u66f4<\/td><td><code>Gson<\/code>\u3067\u306e\u30de\u30c3\u30d4\u30f3\u30b0\u5931\u6557\u306b\u5099\u3048\u3066\u4f8b\u5916\u88dc\u8db3<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd04 \u5168\u4f53\u306e\u6d41\u308c\uff08\u56f3\u89e3\uff09<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"250\" height=\"513\" src=\"https:\/\/itstudy365.com\/blog\/wp-content\/uploads\/2025\/06\/image-1.png\" alt=\"\" class=\"wp-image-1475\" srcset=\"https:\/\/itstudy365.com\/blog\/wp-content\/uploads\/2025\/06\/image-1.png 250w, https:\/\/itstudy365.com\/blog\/wp-content\/uploads\/2025\/06\/image-1-146x300.png 146w\" sizes=\"(max-width: 250px) 100vw, 250px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udca1 \u307e\u3068\u3081<\/h2>\n\n\n\n<p>\u3053\u306e\u30df\u30cb\u30a2\u30d7\u30ea\u3067\u306f\u3001\u6b21\u306e\u3088\u3046\u306a\u91cd\u8981\u306aAndroid\u958b\u767a\u30b9\u30ad\u30eb\u3092\u5b66\u3073\u307e\u3059\uff1a<\/p>\n\n\n\n<ul>\n<li>HTTP\u901a\u4fe1\uff08\u975e\u540c\u671f\uff09\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>JSON \u2192 Java\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u5909\u63db\uff08Gson\uff09<\/li>\n\n\n\n<li>UI\u3068\u30ed\u30b8\u30c3\u30af\u306e\u5206\u96e2\uff08ViewModel\uff09<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u6642\u306e\u30e6\u30fc\u30b6\u30fc\u5bfe\u5fdc<\/li>\n<\/ul>\n\n\n\n<p>Java\u30a8\u30f3\u30b8\u30cb\u30a2\u306e\u8996\u70b9\u304b\u3089\u3059\u308b\u3068\u3001Retrofit\u306f\u300cJAX-RS + Jackson\u300d\u306e\u3088\u3046\u306a\u5f79\u5272\u3092\u679c\u305f\u3057\u3066\u304a\u308a\u3001ViewModel\u306fMVC\u306eController\u306b\u8fd1\u3044\u611f\u899a\u3067\u3059\u3002<br>\u3057\u304b\u3057\u3001<strong>\u975e\u540c\u671f\u6027<\/strong>\u3084<strong>\u30e9\u30a4\u30d5\u30b5\u30a4\u30af\u30eb\u5bfe\u5fdc<\/strong>\u306e\u70b9\u3067\u3001Android\u306a\u3089\u3067\u306f\u306e\u30a2\u30d7\u30ed\u30fc\u30c1\u3092\u53d6\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[54],"_links":{"self":[{"href":"https:\/\/itstudy365.com\/blog\/wp-json\/wp\/v2\/posts\/1474"}],"collection":[{"href":"https:\/\/itstudy365.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itstudy365.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itstudy365.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/itstudy365.com\/blog\/wp-json\/wp\/v2\/comments?post=1474"}],"version-history":[{"count":1,"href":"https:\/\/itstudy365.com\/blog\/wp-json\/wp\/v2\/posts\/1474\/revisions"}],"predecessor-version":[{"id":1476,"href":"https:\/\/itstudy365.com\/blog\/wp-json\/wp\/v2\/posts\/1474\/revisions\/1476"}],"wp:attachment":[{"href":"https:\/\/itstudy365.com\/blog\/wp-json\/wp\/v2\/media?parent=1474"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itstudy365.com\/blog\/wp-json\/wp\/v2\/categories?post=1474"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itstudy365.com\/blog\/wp-json\/wp\/v2\/tags?post=1474"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}