【问题标题】:Fetching and setting images in listView via HTTP通过 HTTP 在 listView 中获取和设置图像
【发布时间】:2012-10-08 16:35:58
【问题描述】:

我正在制作一个通过 Internet 将图像加载到 ListView 的应用程序。它建立在 sdk 15 上,最少 8 个。如果我在版本 8 的模拟器上运行它一切正常,但如果我在任何 sdk 为 11 及以上的东西上运行它,应用程序无法在 ListView 中设置图像然后它只显示一个空列表。 Logcat 对此没有提供任何信息。

我没有成功找到解决此问题的文章,但我认为它最可能是 HTTP 假设从 Internet 获取图像的东西,但我不明白为什么它们不起作用在较新版本的 android 上。

我的代码如下所示。

编辑更新代码:

public class MainActivity extends Activity {

static ArrayList<Tumblr> tumblrs;
ListView listView;
TextView footer;
int offset = 0;
ProgressDialog pDialog;
View v;
String responseBody;
HttpResponse r;
HttpEntity e;
String searchUrl;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);

    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }

    final ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    final NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo();
    if (activeNetwork != null && activeNetwork.isConnected()) {

        setContentView(R.layout.main);

        try {
            tumblrs = getTumblrs();
            listView = (ListView) findViewById(R.id.list);
            View v = getLayoutInflater().inflate(R.layout.footer_layout,
                    null);
            footer = (TextView) v.findViewById(R.id.tvFoot);
            listView.addFooterView(v);
            listView.setAdapter(new UserItemAdapter(this, R.layout.listitem));

        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        new GetChicks().execute();
        footer.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                new loadMoreListView().execute();
            }
        });

    } else {
        setContentView(R.layout.nonet);

    }

}

public class UserItemAdapter extends ArrayAdapter<Tumblr> {

    public UserItemAdapter(Context context, int imageViewResourceId) {
        super(context, imageViewResourceId, tumblrs);

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        v = convertView;
        if (v == null) {

            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.listitem, null);

        }

        Tumblr tumblr = tumblrs.get(position);
        if (tumblr != null) {

            ImageView image = (ImageView) v.findViewById(R.id.avatar);

            if (image != null) {
                image.setImageBitmap(GetImage_usingURl(urls[position]));

            }
        }

        return v;
    }
}

String[] urls = new String[] { "url1", "url2", "url2" };

public Bitmap GetImage_usingURl(String BitmapUrl) {
    try {
        Log.d("Image Download State", " Open Stream For : " + BitmapUrl);
        InputStream in = new java.net.URL(BitmapUrl).openStream();
        Log.d("Image Download State", " Start Decode");

        return BitmapFactory.decodeStream(in);

    } catch (Exception e) {
        Log.e("Error", "" + e.getMessage());
        return null;
    }
}

public ArrayList<Tumblr> getTumblrs() throws ClientProtocolException,
        IOException, JSONException {
    searchUrl = "http://api.tumblr.com/v2/blog/factsandchicks.com/posts?api_key=rTZsymOWtMudbb5tql2U20qQ5ooYLPYVNnL3COPpO2qBHDxJUu&limit=2&offset=0";

    ArrayList<Tumblr> tumblrs = new ArrayList<Tumblr>();
    return tumblrs;
}

private class GetChicks extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        // Showing progress dialog before sending http request
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setMessage("Chicks coming up..");
        pDialog.setIndeterminate(true);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    @Override
    protected Void doInBackground(Void... unused) {
        // TODO Auto-generated method stub

        HttpParams params = new BasicHttpParams();
        params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION,
                HttpVersion.HTTP_1_1);
        HttpClient client = new DefaultHttpClient(params);
        HttpGet get = new HttpGet(searchUrl);

        HttpResponse r = null;
        try {
            r = client.execute(get);
            int status = r.getStatusLine().getStatusCode();
            if (status == 200) {
                e = r.getEntity();
                responseBody = EntityUtils.toString(e);
            }
        } catch (ClientProtocolException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        JSONObject jsonObject;
        try {
            jsonObject = new JSONObject(responseBody);

            JSONArray posts = jsonObject.getJSONObject("response")
                    .getJSONArray("posts");

            for (int i = 0; i < posts.length(); i++) {
                JSONArray photos = posts.getJSONObject(i).getJSONArray(
                        "photos");
                for (int j = 0; j < photos.length(); j++) {
                    JSONObject photo = photos.getJSONObject(j);
                    String url = photo.getJSONArray("alt_sizes")
                            .getJSONObject(0).getString("url");

                    Tumblr tumblr = new Tumblr(url);
                    tumblrs.add(tumblr);

                }
            }

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;
    }

    protected void onPostExecute(Void unused) {
        // Setting new scroll position
        listView.setSelectionFromTop(0, 0);
        pDialog.dismiss();

    }

}

public class Tumblr {

    public String image_url;

    public Tumblr(String url) {

        this.image_url = url;

    }
}

private class loadMoreListView extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        // Showing progress dialog before sending http request
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setMessage("More chicks coming up..");
        pDialog.setIndeterminate(true);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    @Override
    protected Void doInBackground(Void... unused) {
        // TODO Auto-generated method stub

        // increment current page
        offset += 2;

        // Next page request
        tumblrs.clear();
        String searchUrl = "http://api.tumblr.com/v2/blog/factsandchicks.com/posts?api_key=rTZsymOWtMudbb5tql2U20qQ5ooYLPYVNnL3COPpO2qBHDxJUu&limit=2&offset="
                + offset;
        HttpParams params = new BasicHttpParams();
        params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION,
                HttpVersion.HTTP_1_1);
        HttpClient client = new DefaultHttpClient();
        HttpGet get = new HttpGet(searchUrl);

        HttpResponse r = null;
        try {
            r = client.execute(get);
            int status = r.getStatusLine().getStatusCode();
            if (status == 200) {
                HttpEntity e = r.getEntity();
                responseBody = EntityUtils.toString(e);
            }
        } catch (ClientProtocolException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        JSONObject jsonObject;
        try {
            jsonObject = new JSONObject(responseBody);

            JSONArray posts = jsonObject.getJSONObject("response")
                    .getJSONArray("posts");

            for (int i = 0; i < posts.length(); i++) {
                JSONArray photos = posts.getJSONObject(i).getJSONArray(
                        "photos");
                for (int j = 0; j < photos.length(); j++) {
                    JSONObject photo = photos.getJSONObject(j);
                    String url = photo.getJSONArray("alt_sizes")
                            .getJSONObject(0).getString("url");

                    Tumblr tumblr = new Tumblr(url);
                    tumblrs.add(tumblr);

                }
            }

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;
    }

    protected void onPostExecute(Void unused) {
        // Setting new scroll position
        listView.setSelectionFromTop(0, 0);
        pDialog.dismiss();

    }

}

@Override
public boolean onCreateOptionsMenu(android.view.Menu menu) {
    // TODO Auto-generated method stub
    super.onCreateOptionsMenu(menu);
    MenuInflater blowUp = getMenuInflater();
    blowUp.inflate(R.menu.cool_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // TODO Auto-generated method stub
    switch (item.getItemId()) {
    case R.id.aboutUs:
        Intent i = new Intent("com.example.example.ABOUT");
        startActivity(i);

        break;
    case R.id.refresh:
        Intent f = new Intent(MainActivity.this, MainActivity.class);
        startActivity(f);
        finish();
        break;
    case R.id.exit:
        finish();
        break;
    }
    return false;
}

 }

日志

 10-09 13:21:57.923: D/Image Download State(888):  Open Stream For : url1
 10-09 13:21:57.923: E/Error(888): Protocol not found: url1
 10-09 13:21:58.013: D/Image Download State(888):  Open Stream For : url2
 10-09 13:21:58.033: E/Error(888): Protocol not found: url2
 10-09 13:21:58.113: D/Image Download State(888):  Open Stream For : url1
 10-09 13:21:58.123: E/Error(888): Protocol not found: url1
 10-09 13:21:58.153: D/Image Download State(888):  Open Stream For : url2
 10-09 13:21:58.153: E/Error(888): Protocol not found: url2

【问题讨论】:

    标签: android eclipse http listview


    【解决方案1】:

    对于来自互联网的图片试试这个可以帮助你:

    如果你想在创建适配器时下载。

    String[] urls=new String[]{"url1","url2","url2"}
    
    public Bitmap GetImage_usingURl(String url){
      try {
                    Log.d("Image Download State", " Open Stream For : "
                            + url);
                    InputStream in = new java.net.URL(url).openStream();
                    Log.d("Image Download State", " Start Decode");
    
                   return BitmapFactory.decodeStream(in);
    
                     } catch (Exception e) {
                    Log.e("Error", e.getMessage());
                     return null;
                    e.printStackTrace();
                }
    }
    

    当您创建 Adapet 时,只需使用:

    image.setImageBitmap(GetImage_usingURl(urls[position]);
    

    重要对于您的项目而言,当您使用 HTTP 时,您必须获取政策,它仅适用于 API 9 或更高版本,因此我首先检查 VERSION.SDK_INT。

    if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                    .permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
    

    如果您不设置 StrictMode,您的程序可能会崩溃。

    在一切之前设置此代码。

    您的错误: 在 getView 您尝试检查 img!=null 但您现在忘记了它的创建并且它已经为空 所以编译器永远不会进入并设置你的图像,这是第一件事。

    【讨论】:

    • 您好,我尝试使用您的“方式 2”,但它仍然不适合我。我在问题中添加了更新的代码,你能看看我是否使用正确吗?
    • 好的,我必须用新的更改编辑我的答案 使用 HTTP 时,API 9 或更高版本的“策略”很重要。我在您的代码中发现了一个错误,希望对您有所帮助
    • 我已经尝试实现您的代码,但它仍然不适合我。我已经更新了问题中的代码,你能看到我做错了什么吗?
    • 我告诉你从 getView() 中删除 if (image != null)
    • 它仍然对我不起作用。现在日志给了我一个错误。我已将日志包含在我的问题中。
    猜你喜欢
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    相关资源
    最近更新 更多