###前提・実現したいこと
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の取得・表示が行われます。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/29 11:57