質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

868閲覧

非同期処理 #android java

takahirokoide

総合スコア3

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2020/05/13 06:02

前提・実現したいこと

「android アプリ開発の教科書 基礎&応用をしっかり育成!」
という書籍でjavaでandroidアプリ開発の勉強をしています。
11章 非同期処理とweb api連携のところで質問です。
ライブドアの天気情報から現在の情報を取得し、アプリ上でクリックした市町村の情報を表示したいです。

発生している問題・エラーメッセージ

特段エラーは出ていないのですが、クリックしても情報を表示できません。

該当のソースコード

WeatherInfoActivity.java

public class WeatherInfoActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_weather_info); //画面部品ListViewを取得 ListView lvCityList = findViewById(R.id.lvCityList); List<Map<String,String>> cityList = new ArrayList<>(); Map<String ,String> city = new HashMap<>(); city.put("name","大阪"); city.put("id","270000"); cityList.add(city); city = new HashMap<>(); city.put("name","神戸"); city.put("id","280010"); cityList.add(city); city = new HashMap<>(); city.put("name","豊岡"); city.put("id","652872"); cityList.add(city); city = new HashMap<>(); city.put("name","京都"); city.put("id","572849"); cityList.add(city); city = new HashMap<>(); city.put("name","舞鶴"); city.put("id","285698"); cityList.add(city); // SimpleAdapterで使用するfrom-to変数の用意 String [] from = {"name"}; int[] to ={android.R.id.text1}; SimpleAdapter adapter = new SimpleAdapter(WeatherInfoActivity.this,cityList,android.R.layout.simple_expandable_list_item_1,from,to); lvCityList.setAdapter(adapter); lvCityList.setOnItemClickListener(new ListItemClickListener()); } private class ListItemClickListener implements AdapterView.OnItemClickListener{ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Map<String,String> item = (Map<String, String>) parent.getItemAtPosition(position); String cityName = item.get("name"); String cityId = item.get("id"); TextView tvCityName = findViewById(R.id.tvCityName); tvCityName.setText(cityName + "の天気:"); //WeatherInfoReceiverを実行する処理 TextView tvWeatherTelop = findViewById(R.id.tvWeatherTelop); TextView tvWeatherDesc = findViewById(R.id.tvWeatherDesc); WeatherInfoReceiver receiver = new WeatherInfoReceiver(tvWeatherTelop,tvWeatherDesc); receiver.execute(cityId); } } //非同期処理のコード private class WeatherInfoReceiver extends AsyncTask<String,String,String> { private TextView _tvWeatherTelop; private TextView _tvWeatherDesc; public WeatherInfoReceiver(TextView tvWeatherTelop,TextView tvWeatherDesc){ _tvWeatherTelop = tvWeatherTelop; _tvWeatherDesc = tvWeatherDesc; } @Override public String doInBackground(String...params){ String id = params[0]; String urlStr ="http://weather.livedoor.com/forecast/webservice/json/v1?city=" + id; String result = ""; // インターネットに接続する処理 HttpURLConnection con = null; InputStream is = null; try { URL url = new URL(urlStr); con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("GET"); con.connect(); is = con.getInputStream(); result = is2String(is); } catch(MalformedURLException ex){ } catch(IOException ex){ } finally { if(con != null){ con.disconnect(); } if(is != null){ try{ is.close(); } catch(IOException ex){ } } } return result; } @Override public void onPostExecute(String result){ String telop = ""; String desc = ""; //json文字列を解析する処理 try { JSONObject rootJSON = new JSONObject(result); JSONObject descriptionJSON = rootJSON.getJSONObject("description"); desc = descriptionJSON.getString("text"); JSONArray forecasts = rootJSON.getJSONArray("forecasts"); JSONObject forecastNow = forecasts.getJSONObject(0); telop = forecastNow.getString("telop"); } catch (JSONException ex){ } _tvWeatherTelop.setText(telop); _tvWeatherDesc.setText(desc); } //inputStreamオブジェクトを文字列に変換するメソッド private String is2String(InputStream is) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8")); StringBuffer sb = new StringBuffer(); char[] b = new char[1024]; int line; while(0 <=(line = reader.read(b))){ sb.append(b,0,line); } return sb.toString(); } } }

試したこと

リンク先を確認したところ、ページが削除されていたので、そのせいかなと思っています。
しかし、どのURLに接続すべきなのかがわかりません。
ご教授頂きたいです。
よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

android studio/java/API15

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takahirokoide

2020/05/13 08:05

idの意味を理解していませんでした。有難うございます。 大阪の場合、このURLで天気情報表示が取得できるという理解で大丈夫でしょうか?
satokei

2020/05/13 08:54

> 大阪の場合、このURLで天気情報表示が取得できるという理解で大丈夫でしょうか? こちらを確認してください。 http://weather.livedoor.com/weather_hacks/webservice あと、 > 特段エラーは出ていないのですが、クリックしても情報を表示できません。 例外をcatchした後、何もしていないからではないでしょうか。 -------------- catch(~Exception ex){ // ここで何もしていない }
keicha_hrs

2020/05/13 11:45 編集

API15と記されていますが、これは動かそうとしている端末実機のAPIレベルですか?
guest

回答1

0

ベストアンサー

AndroidManifest.xmlに

xml

1 <uses-permission android:name="android.permission.INTERNET" />

のようにインターネットアクセスの許可を得る記述がしていないのではないでしょうか。こちらの手元では、これさえ付加すればご提示のコードのままでも応答を取得することはできるようです。

ただ、サーバーからのレスポンスコード受信による処理がないので、プログラムの問題なのか、サーバーからの404応答なのか見分けが付かないという問題はあるでしょう。例えば次のようにしてどの応答が得られたかLogCatなどで視認できるようにしておくといいでしょう。

java

1 con.connect(); 2 3 int res = con.getResponseCode(); 4 5 if (res == HttpURLConnection.HTTP_OK) { 6 Log.d("WeatherInfoReceiver", "200"); 7 is = con.getInputStream(); 8 result = is2String(is); 9 } else if (res == HttpURLConnection.HTTP_NOT_FOUND) { 10 Log.d("WeatherInfoReceiver", "404"); 11 } else { 12 Log.d("WeatherInfoReceiver", "Another response"); 13 } 14

なお、Android 9.0(API 28)以上の端末を対象とする場合、httpによるアクセスに制約がかかるため他の処置も必要になりますが、質問ではAPI 15とされているため割愛します。

投稿2020/05/13 14:11

編集2020/05/14 14:39
keicha_hrs

総合スコア6768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takahirokoide

2020/05/14 14:13

AndroidManifest.xmlの設定はしておりました。まだ接続できません。 con.connect();の下に int res = con.getResponseCode(); if (res == HttpURLConnection.HTTP_OK) { Log.d("WeatherInfoReceiver", "200"); is = con.getInputStream(); result = is2String(is); } else if (res == HttpURLConnection.HTTP_NOT_FOUND) { Log.d("WeatherInfoReceiver", "404"); } else { Log.d("WeatherInfoReceiver", "Another response"); } をいれて起動しましたがlogcatのほうにもエラーはみられませんでした。 お手数おかけし申し訳ございません。
keicha_hrs

2020/05/14 14:41 編集

API 15ということはAndroid 4.0.3になりますが、それに間違いはありませんか?また、動かしているのは実機なのでしょうか、エミュレーターなのでしょうか?また、こちらの手元で確認した限りでは、大阪と神戸以外の3つは404になるようです。
keicha_hrs

2020/05/14 14:43

それから、デバッグ機能は活用していますか?doInBackground()に入ったところにブレークポイントを設定しておいて1行ずつ実行すると、最後まで流れているでしょうか。IOExceptionなど例外に飛んでいないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問