1

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

我没有成功找到解决此问题的文章,但我认为它最可能是 HTTP 假设从互联网获取图像的东西,但我不明白为什么它们不适用于较新的安卓版本。

我的代码看起来像这样。

编辑更新代码:

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
4

1 回答 1

0

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

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

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但您现在忘记了它的创建并且它已经为空,因此编译器永远不会进入并设置您的图像,这是第一件事。

于 2012-10-08T17:46:42.123 回答