JSON形式で受け取った画像URL(String型)からListViewのImageViewに表示させる方法

1,102 views
Skip to first unread message

Kumamoto Shingo

unread,
Apr 15, 2014, 4:47:43 AM4/15/14
to android-g...@googlegroups.com
こんにちは。
熊本と申します。

ただいまListViewに画像を表示させようとしていてうまくいきません。
データはJSON形式で画像URL(String型)を受け取っています。
イメージアプリとしてはTwitterのようなものです。

流れとしては以下です。

1 DefaultHttpClientを使い非同期処理(AsyncTask)で通信を行う
2 レスポンスでJSON形式の画像URL(String型)を10件取得
3 取得したデータを解析して、ListViewのアイテムにBitmap型かDrawable型で渡す
4 ListView表示

工程3のString型で記されたURLからBitmapもしくはDrawableに変換する時に
エラーで強制終了です。

画像の処理は重いので別スレッドでした方がいいというのは
わかって、コード3でテストしてみてうまくいったのですが、
それをどううまくコード1に適応させるのかがわかりません。

よろしく、よろしくお願いします。



//==================================================//
【コード1】この処理をうまくやりたいです。CustomDataは画像やら文字列をSet,GetするClassです
//===================================================//

     List<CustomData> objects = new ArrayList<CustomData>();

            try {
            JSONArray itemArray  = new JSONArray(受け取ったJSON形式のString);
            int count = itemArray.length();                                 //countは10(件)
                JSONObject[] ImgObject = new JSONObject[count];
                for (int i=0; i<count; i++){
                ImgObject[i] = itemArray.getJSONObject(i);
                }
                
                CustomData[] item = new CustomData[ImgObject.length];
                
                for (int i=0; i<ImgObject.length; i++){
                    String imagetext = ImgObject[i].getString(画像のキー);
                    image = getBitmapFromURL(imagetext);           ←---------------①ここで強制終了
                    item[i] = new CustomData();
              item[i].setImagaData(image);
                objects.add(item[i]);                
                   
                }
            }
            catch (JSONException e){
           
            }   

//================================//
【コード2】①のStringからBitmapへの変換メソッド
//================================//

public static Bitmap getBitmapFromURL(String src) {  
    try {  
    URL url = new URL(src);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true); 
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap myBitmap = BitmapFactory.decodeStream(input);
        return myBitmap;
    } catch (IOException e) {
    Log.d("TEST", "erro");
        e.printStackTrace();  
        return null;  
    }  
}


//==================================================//
【コード3】①が機能した時のテスト…こんな処理を上記の①の部分に入れたらいいの??
//==================================================//

public class MainActivity extends Activity {
private Bitmap image = null;

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

      //-----[ローディングの描画は別スレッドで行う]
        Thread thread = new Thread(new Progress());
        thread.start();
}
public class Progress implements Runnable 
{
public void run() {
try 
{
Thread.sleep(5000);
//ここで画像を読み込む処理などを書く
image = getBitmapFromURL(画像のString);
catch (InterruptedException e) 
{
e.printStackTrace();
}
//-----[読み込み終了の通知]
handler.sendEmptyMessage(0);
}
}
private Handler handler = new Handler() 
{
@Override
public void handleMessage(Message msg)
{
//-----[ダイアログを閉じる]
//dialog.dismiss();
}
};
  public static Bitmap getBitmapFromURL(String src) {  
    try {  
    URL url = new URL(src);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true); 
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap myBitmap = BitmapFactory.decodeStream(input);
        return myBitmap;
    } catch (IOException e) {
    Log.d("TEST", "erro");
        e.printStackTrace();  
        return null;  
    }  
  }
}


























Hirokazu Fukami

unread,
Apr 15, 2014, 4:50:38 AM4/15/14
to android-g...@googlegroups.com
こんにちはfkmです。

エラーが発生したときのLogcatを貼ってください
> --
> このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには
> android-group-j...@googlegroups.com にメールを送信してください。
> このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
-------------------------------------------------------------
深見 浩和(Hirokazu Fukami)

URI:http://www.fkmsoft.jp
email: f...@fkmsoft.jp

Makoto Yamazaki

unread,
Apr 15, 2014, 5:10:28 AM4/15/14
to android-g...@googlegroups.com
zaki です。

特に理由がないのであれば  Picasso とか google の volley を使うのが楽なのでは
ないでしょうか.



2014-04-15 17:47 GMT+09:00 Kumamoto Shingo <season....@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには android-group-j...@googlegroups.com にメールを送信してください。
このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
YAMAZAKI Makoto

Kumamoto Shingo

unread,
Apr 15, 2014, 9:45:28 AM4/15/14
to android-g...@googlegroups.com
fkmさん

以前も私の質問に答えて頂きましたね^^
ありがとうございます。

Logcatです。


04-15 13:37:07.506: E/AndroidRuntime(3156): FATAL EXCEPTION: main
04-15 13:37:07.506: E/AndroidRuntime(3156): android.os.NetworkOnMainThreadException
04-15 13:37:07.506: E/AndroidRuntime(3156): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
04-15 13:37:07.506: E/AndroidRuntime(3156): at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
04-15 13:37:07.506: E/AndroidRuntime(3156): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
04-15 13:37:07.506: E/AndroidRuntime(3156): at java.net.InetAddress.getAllByName(InetAddress.java:220)
04-15 13:37:07.506: E/AndroidRuntime(3156): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
04-15 13:37:07.506: E/AndroidRuntime(3156): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
04-15 13:37:07.506: E/AndroidRuntime(3156): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
04-15 13:37:07.506: E/AndroidRuntime(3156): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
04-15 13:37:07.506: E/AndroidRuntime(3156): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
04-15 13:37:07.506: E/AndroidRuntime(3156): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
04-15 13:37:07.506: E/AndroidRuntime(3156): at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
04-15 13:37:07.506: E/AndroidRuntime(3156): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
04-15 13:37:07.506: E/AndroidRuntime(3156): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
04-15 13:37:07.506: E/AndroidRuntime(3156): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
04-15 13:37:07.506: E/AndroidRuntime(3156): at com.example.lineblog.MainActivity.getBitmapFromURL(MainActivity.java:239)
04-15 13:37:07.506: E/AndroidRuntime(3156): at com.example.lineblog.MainActivity.Getit(MainActivity.java:162)
04-15 13:37:07.506: E/AndroidRuntime(3156): at com.example.lineblog.MainActivity$1.onPostCompleted(MainActivity.java:106)
04-15 13:37:07.506: E/AndroidRuntime(3156): at com.example.lineblog.HttpPostHandler.handleMessage(HttpPostHandler.java:21)
04-15 13:37:07.506: E/AndroidRuntime(3156): at android.os.Handler.dispatchMessage(Handler.java:99)
04-15 13:37:07.506: E/AndroidRuntime(3156): at android.os.Looper.loop(Looper.java:137)
04-15 13:37:07.506: E/AndroidRuntime(3156): at android.app.ActivityThread.main(ActivityThread.java:4475)
04-15 13:37:07.506: E/AndroidRuntime(3156): at java.lang.reflect.Method.invokeNative(Native Method)
04-15 13:37:07.506: E/AndroidRuntime(3156): at java.lang.reflect.Method.invoke(Method.java:511)
04-15 13:37:07.506: E/AndroidRuntime(3156): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
04-15 13:37:07.506: E/AndroidRuntime(3156): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:559)
04-15 13:37:07.506: E/AndroidRuntime(3156): at dalvik.system.NativeStart.main(Native Method)






Kumamoto Shingo

unread,
Apr 15, 2014, 9:45:49 AM4/15/14
to android-g...@googlegroups.com
zakiさん

そのような便利なライブラリがあるのですね。
ありがとうございます。早速使ってみます。

Makoto Yamazaki

unread,
Apr 15, 2014, 11:25:16 AM4/15/14
to android-g...@googlegroups.com
zaki です。

logcat に書いてあるとおり NetworkOnMainThreadException です。
メインスレッドで通信をしないように実装すればこのエラーは解消されます。

先ほど書いた volley や Picasso はそのあたりを自然な形で実現してくれます


--
このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには android-group-j...@googlegroups.com にメールを送信してください。
このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
YAMAZAKI Makoto
Reply all
Reply to author
Forward
0 new messages