0

YouTube の各動画には画像があります。jsonc ファイルを使用して、その画像のソースを取得できます。その画像のソースを取得し、ビットマップを使用してコスチュームリストビューの画像ビューに配置するために、文字列に保存するコードを作成しました。解析では、画像のソースを保存できます。しかし、私のコスチュームビューが表示されているとき、画像は表示されませんでした. ネットワークから画像を取得することは非常に悪いことであり、UI スレッドでネットワーク呼び出しを行うべきではないと言われました。そして、ビットマップを管理およびキャッシュするためにライブラリを使用する必要があります。これを解決するにはどうすればよいですか?

jsonc ファイルから解析を行った主なアクティビティは次のとおりです。

import java.util.ArrayList;
import java.util.Collection;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.DefaultClientConnection;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;


import com.example.tstnetconnwithjson.tables.custome;
import com.example.tstnetconnwithjson.tables.videos;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {



    Button search; ; 
    TextView name ; 
    ListView listview ; 
    ArrayList<videos > videolist; 
    ArrayAdapter< videos > adapter ; 
    AlertDialog.Builder alert ; 
    ProgressDialog progressdialog ; 
    EditText name;

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

        videolist = new ArrayList<videos>(); 
        adapter = new ArrayAdapter<videos>(this, android.R.layout.simple_list_item_1 , android.R.id.text1,videolist); 
        name=(EditText) findViewById(R.id.editText1);
        alert = new Builder(this); 
        alert.setTitle("Warnning" ) ; 
        alert.setMessage("You want to connect to the internet ..? " ); 


        alert.setNegativeButton("No ", null); 
        alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface arg0, int arg1) {
                String username=name.getText().toString();
                            new connection().execute("https://gdata.youtube.com/feeds/api/videos?author="+username+"&v=2&alt=jsonc");   

            }
        });



        progressdialog = new ProgressDialog(this); 

        progressdialog.setMessage("Wait Loading .... "); 
        progressdialog.setCancelable(false); 





        search = (Button) findViewById(R.id.button1); 
        name = (TextView) findViewById(R.id.textView1); 

        listview = (ListView) findViewById(R.id.listView1); 

        listview.setAdapter(adapter); 


        search.setOnClickListener(new OnClickListener() {

            public void onClick(View arg0) {
            alert.show();   


            }
        });
    }

    class connection extends AsyncTask<String, Integer, String>{


        @Override
        protected void onPreExecute() {
             progressdialog.show(); 
            super.onPreExecute();
        }
        @Override
        protected String doInBackground(String... arg0) {

            String s = GetUrlBody(arg0[0]); 




            return s;
        }

        @Override
        protected void onPostExecute(String result) {

        try{

            JSONObject jo =(JSONObject) new JSONTokener(result).nextValue();

        JSONObject feed = jo.optJSONObject("data");
        JSONArray entry = feed.optJSONArray("items");


        for(int i = 0 ; i<entry.length() ; i++){

        String title = entry.getJSONObject(i).getString("title");

        String thumbURL = entry.getJSONObject(i).getJSONObject("thumbnail").getString("sqDefault");
        Log.d("after get image", "ok")
        String   url;
        try {
            url = entry.getJSONObject(i).getJSONObject("player").getString("mobile");
        } catch (JSONException ignore) {
            url = entry.getJSONObject(i).getJSONObject("player").getString("default");
        }

        String description = entry.getJSONObject(i).getString("description");
        Log.d("after get description", "ok");
        videos videoobject=new videos();
        videoobject.setDecscrption(description);
        videoobject.setImageurl(thumbURL);
        videoobject.setVediourl(url);
        videoobject.setVideoname(title);

        videolist.add(videoobject);
        }
        listview.setAdapter(new custome(MainActivity.this,videolist));
        Log.d("AFTER set custome ", "before notify changes");


        adapter.notifyDataSetChanged(); 

        }catch(Exception exception) {
            Log.d("exception ", "nock nock nock....");
            Log.e("json ", exception.getMessage()); 
        }

            progressdialog.dismiss(); 
            super.onPostExecute(result); 

        } 




        String GetUrlBody (String Url ){

            HttpClient client = new DefaultHttpClient(); 

            HttpGet gethttp = new HttpGet(Url); 

            try{
            HttpResponse response = client.execute(gethttp); 

            if(response.getStatusLine().getStatusCode() == 200){

                String save =
            EntityUtils.toString(response.getEntity(), HTTP.UTF_8); 

                return save; 

            }else {
                return "Not Found"; 
            }

            }catch(Exception exception){}




            return null; 
        }



    }


}

そして、ここに私の衣装リストビューがあります:

public class custome extends BaseAdapter {



    ArrayList<videos> data=new ArrayList<videos>();
    android.content.Context context1;
    android.widget.TextView name;
    ImageView  picture;

    public custome(Context context,ArrayList<videos>arrayList) {
        // TODO Auto-generated constructor stub
        context1=context;
       data= arrayList;
    }




    public int getCount() {
        // TODO Auto-generated method stub
        return data.size();
    }

    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return data.get(arg0);
    }

    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return arg0;
    }

    public View getView(int arg0, View arg1, ViewGroup arg2) {
        View view=arg1;

        if(view==null)
        {   
            LayoutInflater layoutInflater=(LayoutInflater) _c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            view=layoutInflater.inflate(R.layout.listvideo,null); 
        }
        name=(TextView) view.findViewById(R.id.textView1);
        picture=(ImageView) view.findViewById(R.id.imageView1);

        videos video = data.get(arg0);
        name.setText(video.getVideoname());


        URL url = null;
        try {
            url = new URL(video.getImageurl());
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Bitmap bitmap = null;
        try {
            bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        picture.setImageBitmap(bitmap);





        return view;
    }

}
4

2 に答える 2

2

Thread を使用してネットワークから画像をダウンロードし、InputStream を取得してから Bitmap に解析することをお勧めします。完全なプロジェクトはこちら: E4U プロジェクト

import java.io.InputStream;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ImageView;

public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
      ImageView bmImage;

      public DownloadImageTask(ImageView bmImage) {
          this.bmImage = bmImage;
      }

      protected Bitmap doInBackground(String... urls) {
          String urldisplay = urls[0];
          Bitmap mIcon11 = null;
          try {
            InputStream in = new java.net.URL(urldisplay).openStream();
            mIcon11 = BitmapFactory.decodeStream(in);
          } catch (Exception e) {
              Log.e("Error", e.getMessage());
              e.printStackTrace();
          }
          return mIcon11;
      }

      protected void onPostExecute(Bitmap result) {
          bmImage.setImageBitmap(result);
      }
}   
于 2013-08-04T09:36:02.420 に答える
1

表示用にネットから画像をダウンロードし、キャッシュが必要になる可能性があることは、多くの人が解決した非常に一般的な問題です。独自のソリューションを展開してデバッグするのではなく、これらの試行済みの実用的なソリューションのいずれかを使用することを強くお勧めします。

  1. Ion ( https://github.com/koush/ion ) - 非常に柔軟で機能が充実しており、画像だけでなく、JSON、文字列、ファイル、および Java 型もダウンロードできます。これについて私が本当に気に入っている部分は、アクティビティの呼び出しが終了したときに操作を自動的にキャンセルできるため、ユーザーは表示されなくなる画像をダウンロードする時間と帯域幅を無駄にしないことです。
  2. Universal Image Loader ( https://github.com/nostra13/Android-Universal-Image-Loader ) - ほとんどのユースケースで同様に機能しますが、画像のダウンロード/キャッシュのみに対応しています
于 2013-08-04T09:45:28.760 に答える