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

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

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

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Java

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

Android

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

Q&A

解決済

1回答

1441閲覧

他クラスから参照したHTTP通信メソッドがエラーになってしまいます。

s.k

総合スコア423

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Java

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

Android

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

0グッド

0クリップ

投稿2017/05/29 11:25

編集2017/05/29 11:27

###前提・実現したいこと
HTTP通信で取得したJSONデータをListView表示したいです。

・以下二つのクラスで構成されています。

①HttpApi

APIと通信し、JSONデータを配列で取得します。

②ListViewEx

①のクラスのHTTP通信メソッドを呼び出し、取得したJSONデータをリスト表示します。

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

何も表示されません。
HTTP通信メソッドがエラーを引き起こし、
catchされ、用意した配列変数にnullが格納されてしまいます。

###該当のソースコード

HttpApi.java

Java

1public class HttpApi extends Activity implements View.OnClickListener { 2 private final static int WC = LinearLayout.LayoutParams.WRAP_CONTENT; 3 private final static int MP = LinearLayout.LayoutParams.MATCH_PARENT; 4 private final static String TAG_READ = "read"; 5 private EditText editText; 6 private ArrayList<String> text; 7 private Handler handler = new Handler(); 8 private JSONObject json; 9 private String jsonObject; 10 11 //テキストファイルのURLの指定(1) 12 private final static String URL = 13 "http://candii.tk/api/v1/images"; 14 15 //アクティビティ起動時に呼ばれる 16 @Override 17 public void onCreate(Bundle bundle) { 18 super.onCreate(bundle); 19 requestWindowFeature(Window.FEATURE_NO_TITLE); 20 21 //レイアウトの生成 22 LinearLayout layout = new LinearLayout(this); 23 layout.setBackgroundColor(Color.WHITE); 24 layout.setOrientation(LinearLayout.VERTICAL); 25 setContentView(layout); 26 27 //エディットテキストの生成 28 editText = new EditText(this); 29 editText.setText(""); 30 editText.setLayoutParams(new LinearLayout.LayoutParams(MP, WC)); 31 layout.addView(editText); 32 33 //ボタンの生成 34 layout.addView(makeButton("HTTP通信", TAG_READ)); 35 } 36 37 //ボタンの生成 38 private Button makeButton(String text, String tag) { 39 Button button = new Button(this); 40 button.setText(text); 41 button.setTag(tag); 42 button.setOnClickListener(this); 43 button.setLayoutParams(new LinearLayout.LayoutParams(WC, WC)); 44 return button; 45 } 46 47 //ボタンクリック時に呼ばれる 48 public void onClick(View v) { 49 String tag = (String)v.getTag(); 50 if (TAG_READ.equals(tag)) { 51 //スレッドの生成(4) 52 Thread thread = new Thread(new Runnable() {public void run() { 53 //HTTP通信 54 try { 55 text = new ArrayList(http2data(URL)); 56 } catch (Exception e) { 57 text = null; 58 } 59 //ハンドラの生成(5) 60 handler.post(new Runnable() {public void run() { 61 if (text != null) { 62 for (int i = 0; i < text.size(); i++) { 63 editText.setText(text.get(i)); 64 } 65 } 66 }}); 67 }}); 68 thread.start(); 69 } 70 } 71 72 //HTTP通信 73 public static ArrayList<String> http2data(String path) throws Exception {★★★★ ①HTTP通信メソッド 74 HttpURLConnection c = null; 75 InputStream in = null; 76 ByteArrayOutputStream out = null; 77 try { 78 //HTTP接続のオープン(2) 79 URL url = new URL(path); 80 c = (HttpURLConnection)url.openConnection(); 81 c.setRequestMethod("GET"); 82 c.connect(); 83 in = c.getInputStream(); 84 String readSt = readInputStream(in); 85 86 ArrayList<String> list = new ArrayList<>(); 87 JSONArray jsonArray = new JSONArray(readSt); 88 89 for (int i = 0; i < jsonArray.length(); i++) { 90 //JSONオブジェクトをパースして、レコードのname属性をログ出力 91 JSONObject jsonObject = jsonArray.getJSONObject(i); 92 list.add(jsonObject.getString("en_title")); 93 } 94 95 //HTTP接続のクローズ(3) 96 in.close(); 97 c.disconnect(); 98 return list; 99 100 } catch (Exception e) { 101 try { 102 if (c != null) c.disconnect(); 103 if (in != null) in.close(); 104 if (out != null) out.close(); 105 } catch (Exception e2) { 106 } 107 throw e; 108 } 109 } 110 111 public static String readInputStream(InputStream in) throws IOException, UnsupportedEncodingException { 112 StringBuffer sb = new StringBuffer(); 113 String st = ""; 114 115 BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8")); 116 while((st = br.readLine()) != null) 117 { 118 sb.append(st); 119 } 120 try 121 { 122 in.close(); 123 } 124 catch(Exception e) 125 { 126 e.printStackTrace(); 127 } 128 129 return sb.toString(); 130 } 131}

ListViewEx.java

public class ListViewEx extends Activity { private HttpApi sc; //テキストファイルのURLの指定(1) private final static String URL = "http://candii.tk/api/v1/images"; public List<String> list = new ArrayList<String>(); private ArrayList<String> text; private final static String TAG_READ = "read"; private Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_listviewex); // ListView変数の宣言 ListView listView = (ListView)findViewById(R.id.listView); // List変数の宣言 sc = new HttpApi(); Thread thread = new Thread(new Runnable() {public void run() { //HTTP通信 try { text = new ArrayList(sc.http2data(URL)); } catch (Exception e) { text = null; ★★★こちらの処理が実行されてしまいます。 } //ハンドラの生成(5) handler.post(new Runnable() {public void run() { if (text != null) { for (int i = 0; i < text.size(); i++) { list.add(text.get(i)); } } else { list.add("klsvkl"); } }}); }}); thread.start(); // ListをセットしたArrayAdapter変数の宣言 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list); // リストビューにArrayAdapter変数をセット listView.setAdapter(adapter); } }

###試したこと
HttpApi単体でもJSONデータを取得表示できます。HttpApiで試すとエラーを起こさずに、HTTP通信、JSONの取得・表示が行われます。

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Activityは特殊なクラスでプログラマーがインスタンス化して使うものではありません。
また、インスタンス化してもActivityは不完全な状態なため使用することはできません。

最近Activityをインスタンス化して動かないと言う質問がたびたび上がりますが、何かに書いてあるのでしょうか?

また、エラーが発生した場合はエラーログを質問に記載してください。

投稿2017/05/29 11:49

yona

総合スコア18155

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

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

s.k

2017/05/29 11:57

あ、そうなんですね! ありがとうございます! 書いてないです!わからなかっただけです! エラーログ、次回から記載します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問