1

インターネット経由でListViewに画像を読み込むアプリを作っています。最小8のsdk15で構築されています。バージョン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をチェックしようとしますが、今すぐ作成し、すでにnullであるため、コンパイラが画像を取得して設定することはありません。これが最初です。

于 2012-10-08T17:46:42.123 に答える