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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1736閲覧

OpenweatherAPIからデータを取ってくる

hashimoyakumo

総合スコア15

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2017/10/02 13:25

編集2017/10/03 13:11

失礼します。現在、このサイトを参考にOpen weather APIから天気データをとってこようと考えているのですが下記のコードのgetInputStream(29行目)のところで強制終了してしまいます。
どなたか恐縮ですがお知恵を拝借させていただけないでしょうか?マニフェスト部分にも

java

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

を追記はしています。また、requestURLの部分を直接ブラウザに打ち込んだときも正常に天気情報を取得できます。
よろしくお願いいたします。

<追記>エラーコードは以下のようになっています

java

1Caused by: android.os.NetworkOnMainThreadException 2 at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273) 3 at java.net.InetAddress.lookupHostByName(InetAddress.java:431) 4 at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) 5 at java.net.InetAddress.getAllByName(InetAddress.java:215) 6 at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29) 7 at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188) 8 at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157) 9 at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100) 10 at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:357) 11 at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340) 12 at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330) 13 at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248) 14 at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:437) 15 at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:388) 16 at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:231) 17 at com.test.hashimoto.test.MainActivity.onCreate(MainActivity.java:29) 18 at android.app.Activity.performCreate(Activity.java:6251) 19 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 20 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 21 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  22 at android.app.ActivityThread.-wrap11(ActivityThread.java)  23 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  24 at android.os.Handler.dispatchMessage(Handler.java:102)  25 at android.os.Looper.loop(Looper.java:148)  26 at android.app.ActivityThread.main(ActivityThread.java:5417)  27 at java.lang.reflect.Method.invoke(Native Method)  28 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  29 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

ソースコード

java

1import android.support.v7.app.AppCompatActivity; 2import android.os.Bundle; 3 4import java.io.BufferedReader; 5import java.io.IOException; 6import java.io.InputStream; 7import java.io.InputStreamReader; 8import java.io.UnsupportedEncodingException; 9import java.net.MalformedURLException; 10import java.net.URL; 11 12public class MainActivity extends AppCompatActivity { 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_main); 18 //下記のURLをブラウザに打ち込んだときは正常にデータを取得できる 19 String requestURL = "http://api.openweathermap.org/data/2.5/find?lat=43.067885&lon=141.355539&cnt=1&mode=json&&APPID=自分のID"; 20 URL url = null; 21 try { 22 url = new URL(requestURL); 23 } catch (MalformedURLException e) { 24 e.printStackTrace(); 25 } 26 InputStream is = null; 27 try { 28 is = url.openConnection().getInputStream();//ここで強制終了 29 } catch (IOException e) { 30 e.printStackTrace(); 31 } 32 33 // JSON形式で結果が返るためパースのためにStringに変換する 34 BufferedReader reader = null; 35 try { 36 reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); 37 } catch (UnsupportedEncodingException e) { 38 e.printStackTrace(); 39 } 40 StringBuilder sb = new StringBuilder(); 41 String line; 42 try { 43 while (null != (line = reader.readLine())) { 44 sb.append(line); 45 } 46 } catch (IOException e) { 47 e.printStackTrace(); 48 } 49 String data = sb.toString(); 50 51 } 52} 53

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

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

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

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

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

guest

回答1

0

ベストアンサー

UIスレッドでの通信はやめましょう。
AsyncTaskやAsyncTaskLoader等を使いワーカースレッド内で通信処理を行うようにしましょう。

また、エラーメッセージは省略せずに質問に追記してください。

投稿2017/10/02 23:59

yona

総合スコア18155

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

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

hashimoyakumo

2017/10/03 13:14

回答ありがとうございます。 調べてみたところyonaさんのおっしゃるようにメインスレッド内で通信しようとしているために android.os.NetworkOnMainThreadExceptionが発生して強制終了されるようです。 大変参考になるご意見ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問