JSON到网格视图(无法解码流:java.io.FileNotFoundException)


JSON to grid view (Unable to decode stream: java.io.FileNotFoundException)

我正试图在GridView中显示从远程数据库(mysql)中存储的路径到android应用程序的图像。但我不知道该怎么做。这是我的尝试,我非常感谢你的帮助。

这是我从数据库检索URL的活动:

public class City_about extends Activity {
TextView tv_Cityname;
TextView tv_City_descr;
GridView gridview;
String StringCity_name,StringDescription;
// JSON
JSONParser jsonparser;
JSONObject JSONObject;
JSONArray jsonArray;
ProgressDialog ProgressDialog;
int value;
private static final String TAG_MESSAGE = "message";
// Images
String[] Image_id,Image_url,Caption;
public ImageAdapter Adapter;
Bitmap bitmap;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_about_city);
Intent i = this.getIntent();
StringCity_name =  i.getStringExtra("City_name");
StringDescription =  i.getStringExtra("Description");
// Views declaration
tv_Cityname = (TextView)findViewById(R.id.tv_Cityname);
tv_Cityname.setText(StringCity_name);
tv_City_descr = (TextView)findViewById(R.id.tv_City_descr);
tv_City_descr.setText(StringDescription);
gridview = (GridView)findViewById(R.id.gv_pictures);
jsonparser = new JSONParser();   
new City_ImageTask().execute();

} // End of OnCreate
    public class City_ImageTask extends AsyncTask<String,String,String>{
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
List<NameValuePair> list = new ArrayList<NameValuePair>();
list.add(new BasicNameValuePair("City_name",StringCity_name.toString()));
try {               
JSONObject = jsonparser.makeHttpRequest("http://192.168.1.8/Yourguideapplication/City_Images.php", "POST", list);
Log.e("pass 1", "connection success ");
}
catch (Exception e) {
Log.e("Fail 1", "Fail connection");
}
try {
value = JSONObject.getInt("value");
if (value==1){
jsonArray = JSONObject.getJSONArray("Images");
Image_url = new String[jsonArray.length()];
Caption = new String[jsonArray.length()];
for (int i = 0 ; i < jsonArray.length() ; i++)
{
JSONObject object = jsonArray.getJSONObject(i);
Image_url[i] = object.getString("Image_url");
Caption[i] = object.getString("Caption");
}
} else {
value = 0;
}
} catch (Exception e){
Log.d("ERORR",e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if (value == 1){
Adapter = new ImageAdapter(City_about.this,Image_url, Caption);
gridview.setAdapter(Adapter);
} else {
Toast.makeText(City_about.this, "Error", Toast.LENGTH_LONG).show();
}
} 
}
}

我确信php页面运行良好,我检索到了url

我的适配器:

// Image Adapter
public class ImageAdapter extends BaseAdapter {
String[] Image_id,Image_url,Caption;
private Activity activity;
Bitmap bitmap;
ImageView imageView;
public ImageAdapter(Activity activity, String[] Image_url,
String[] Caption) {
// TODO Auto-generated constructor stub
super();
this.Image_url = Image_url;
this.Caption = Caption;
this.activity = activity;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return Image_url.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return Image_url[position];
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
public static class ViewHolder
{
public ImageView imgViewFlag;
public TextView txtViewTitle;
}
// ImageView View 
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
imageView = new ImageView(activity);
imageView.setLayoutParams(new GridView.LayoutParams(300, 300));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(5, 5, 5, 5);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageURI(Uri.parse("http://192.168.1.8/Yourguideapplication/"+Image_url[position]));
return imageView;
}
}

日志猫显示:

04-08 18:55:10.349: D/JSON Parser(2751):  {"Images":[{"Image_id":"1","Image_url":"pics'/Riyadh'/RD1.jpg","Caption":"'u0645'u062f'u064a'u0646'u0629 'u0627'u0644'u0631'u064a'u0627'u0636 'u0644'u064a'u0644'u0627'u064b"},{"Image_id":"2","Image_url":"pics'/Riyadh'/RD2.jpg","Caption":"'u0642'u0635'u0631 'u0627'u0644'u0645'u0635'u0645'u0643"},{"Image_id":"3","Image_url":"pics'/Riyadh'/RD3.jpg","Caption":"'u0645'u062f'u064a'u0646'u0629 'u0627'u0644'u0631'u064a'u0627'u0636."},{"Image_id":"4","Image_url":"pics'/Riyadh'/RD4.jpg","Caption":"'u0628'u0631'u062c 'u0627'u0644'u0645'u0645'u0644'u0643'u0629"}],"value":1}
04-08 18:55:10.349: E/pass 1(2751): connection success 
04-08 18:55:10.449: E/BitmapFactory(2751): Unable to decode stream: java.io.FileNotFoundException: /http:/192.168.1.8/Yourguideapplication/pics/Riyadh/RD1.jpg: open failed: ENOENT (No such file or directory)
04-08 18:55:10.449: I/System.out(2751): resolveUri failed on bad bitmap uri: http://192.168.1.8/Yourguideapplication/pics/Riyadh/RD1.jpg
04-08 18:55:10.449: E/BitmapFactory(2751): Unable to decode stream: java.io.FileNotFoundException: /http:/192.168.1.8/Yourguideapplication/pics/Riyadh/RD1.jpg: open failed: ENOENT (No such file or directory)
04-08 18:55:10.449: I/System.out(2751): resolveUri failed on bad bitmap uri: http://192.168.1.8/Yourguideapplication/pics/Riyadh/RD1.jpg
04-08 18:55:10.449: E/BitmapFactory(2751): Unable to decode stream: java.io.FileNotFoundException: /http:/192.168.1.8/Yourguideapplication/pics/Riyadh/RD1.jpg: open failed: ENOENT (No such file or directory)
04-08 18:55:10.449: I/System.out(2751): resolveUri failed on bad bitmap uri: http://192.168.1.8/Yourguideapplication/pics/Riyadh/RD1.jpg

我可以在Emulator中看到空图片"Nothing appeared",我认为问题是它在http 之前添加了额外的"/"

根据前面的问题,我认为解决方案是创建单独的AsyncTask来下载图像,我只是不知道是如何

请帮帮我

您只需要在适配器中使用任何Image Loader。您也可以使用Picasso图像加载器。阅读您只需要下载jar并将其作为外部jar添加到您的项目中。然后

    @Override public void getView(int position, View convertView, ViewGroup parent) {
         if (convertView == null) {
    imageView = new ImageView(activity);
    imageView.setLayoutParams(new GridView.LayoutParams(300, 300));
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    imageView.setPadding(5, 5, 5, 5);
    } else {
    imageView = (ImageView) convertView;
    }
    String url = "http://192.168.1.8/Yourguideapplication/"+Image_url[position]);
    Picasso.with(context).load(url).into(imageView);
    return imageView;           
        }

对于图像加载,您可以使用将URL和图像视图传递给Picasso Loader

Picasso.with(context).load(url).into(imageView);

在这种情况下无需设置URI