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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

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

Android

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

Android Studio

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

Q&A

解決済

2回答

6817閲覧

androidでweb上のJSONを取得したいが強制停止してしまう

aaaaaaaaaaaaaa

総合スコア77

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2015/11/02 07:46

編集2015/11/02 08:42

androidでweb上のjsonのデータを読み込もうとしていますが
実行後問題が発生してアプリが終了してしまいます。
どなたか助けてください。
manifestsには <uses-permission android:name="android.permission.INTERNET" />を記入しています。
あとライブラリーはApache HttpComponentsを使っています。
エラーログは以下のようになっています。

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
E/AndroidRuntime: Process: com.tes.test.myapplication, PID: 18097
E/AndroidRuntime: java.lang.RuntimeException: An error occured while executing doInBackground()
E/AndroidRuntime: at android.os.AsyncTask$3.done(AsyncTask.java:300)
E/AndroidRuntime: at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
E/AndroidRuntime: at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
E/AndroidRuntime: at java.util.concurrent.FutureTask.run(FutureTask.java:242)
E/AndroidRuntime: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
E/AndroidRuntime: at java.lang.Thread.run(Thread.java:818)
E/AndroidRuntime: Caused by: java.lang.IllegalArgumentException: Illegal character in path at index 0: [Ljava.lang.String;@3495432c
E/AndroidRuntime: at java.net.URI.create(URI.java:730)
E/AndroidRuntime: at org.apache.http.client.methods.HttpGet.<init>(HttpGet.java:75)
E/AndroidRuntime: at com.tes.test.myapplication.MainActivity$AsyncHttpRequest.doInBackground(MainActivity.java:41)
E/AndroidRuntime: at com.tes.test.myapplication.MainActivity$AsyncHttpRequest.doInBackground(MainActivity.java:28)
E/AndroidRuntime: at android.os.AsyncTask$2.call(AsyncTask.java:288)
E/AndroidRuntime: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
E/AndroidRuntime: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
E/AndroidRuntime: at java.lang.Thread.run(Thread.java:818) 

ソースは以下のようになっています。

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

String url = "http://192.168.1.1/keziban/api/Post_api.php";//ローカルネット AsyncHttpRequest task = new AsyncHttpRequest(this); task.execute(url); } public class AsyncHttpRequest extends AsyncTask<String,Void,String> { private Activity MainActivity; public AsyncHttpRequest(Activity activity) { this.MainActivity = activity; } @Override protected String doInBackground(String...builder) { DefaultHttpClient objHttp = new DefaultHttpClient(); HttpParams params = objHttp.getParams(); HttpConnectionParams.setConnectionTimeout(params, 1000); //接続のタイムアウト HttpConnectionParams.setSoTimeout(params, 1000); //データ取得のタイムアウト String sReturn = ""; try { HttpGet objGet = new HttpGet(builder.toString()); HttpResponse objResponse = objHttp.execute(objGet); if (objResponse.getStatusLine().getStatusCode() < 400){ InputStream objStream = objResponse.getEntity().getContent(); InputStreamReader objReader = new InputStreamReader(objStream); BufferedReader objBuf = new BufferedReader(objReader); StringBuilder objJson = new StringBuilder(); String sLine; while((sLine = objBuf.readLine()) != null){ objJson.append(sLine); } sReturn = objJson.toString(); objStream.close(); } } catch (IOException e) { return null; } return sReturn; } @Override protected void onPostExecute(String result) { //TextView tv = (TextView) MainActivity.findViewById(R.id.name); //tv.setText(result); } }

どうかよろしくおねがいします。

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

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

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

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

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

yona

2015/11/02 07:58

質問を修正し、エラーログを追記してください。
yona

2015/11/02 08:18

抜粋ではなく全てのエラーログを追記してください。とくにcause byと書かれているところが重要です。
guest

回答2

0

Java

1protected String doInBackground(String...builder) { 2 // 中略 3}

このメソッドの引数は...から分かるように、可変長引数です。

Java

1HttpGet objGet = new HttpGet(builder.toString());

つまり、ここのbuilderは配列なのです。

質問者さんは、おそらく「http://192.168.1.1/keziban/api/Post_api.php」を想定していたのだと思いますが、配列を`toString`しているため、メタ情報「[Ljava.lang.String;@3495432c」(Stringの配列で、ハッシュコードが3495432c、という意味)の文字列が返ってきてしまっています。
これはどう見てもURLの書式ではなく、そのため例外が発生しています。

そのあたりのことは、ログのここを読めば全て分かります。

E/AndroidRuntime: Caused by: java.lang.IllegalArgumentException: Illegal character in path at index 0: [Ljava.lang.String;@3495432c
E/AndroidRuntime: at java.net.URI.create(URI.java:730)
E/AndroidRuntime: at org.apache.http.client.methods.HttpGet.<init>(HttpGet.java:75)
E/AndroidRuntime: at com.tes.test.myapplication.MainActivity$AsyncHttpRequest.doInBackground(MainActivity.java:41)

直し方としては、そもそも型がStringなので、toStringを使わず、そのまま配列の要素0番目を使えばよいかと思います。

HttpGet objGet = new HttpGet(builder[0]);

投稿2015/11/02 09:36

shiolier

総合スコア1156

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

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

0

ベストアンサー

Java

1doInBackground(String...builder)

この引数は可変引数といって、Stringの配列となっています。
そうすると、下記の記述は配列をtoStringしているため、予想外の動きとなります。

Java

1HttpGet objGet = new HttpGet(builder.toString());

正しくは下記の通りです。

Java

1HttpGet objGet = new HttpGet(builder[0]);

投稿2015/11/02 09:35

yona

総合スコア18155

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

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

aaaaaaaaaaaaaa

2015/11/02 10:37

上記の方法で上のエラーはなくなりましたが、次はこのようなエラーが出ました。 以下のエラーはライブラリーの問題でしょうか。 E/AndroidRuntime: Caused by: java.lang.NoSuchMethodError: No virtual method execute(Lorg/apache/http/client/methods/HttpUriRequest;)Lorg/apache/http/client/methods/CloseableHttpResponse; in class Lorg/apache/http/impl/client/DefaultHttpClient; or its super classes (declaration of 'org.apache.http.impl.client.DefaultHttpClient' appears in /system/framework/ext.jar)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問