从json,android下载图像

时间:2014-03-11 01:22:20

标签: android json image android-asynctask

我的应用会收到一个jsonArray,其中包含类别及其图片网址的名称。 所以我想提取名称,并通过他们的网址下载图像。 实际上,我成功地提取了名称和网址,请看下面的代码:

            private class ReadPlacesFeedTask extends AsyncTask<String, Void, String>              {
    protected String doInBackground(String... urls) {
        return readJSONFeed(urls[0]);


    }

    protected void onPostExecute(String result) {

        try {
            JSONObject jsonobject = new JSONObject(result);
            JSONArray categories = new JSONArray(
                    jsonobject.getString("categories"));
            for (int i = 0; i < categories.length(); i++) {
                JSONObject category = categories.getJSONObject(i);
                names.add(category.getString("name"));
                images.add(category.getString("image"));
            }

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

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                getBaseContext(), R.layout.row_channel_layout,
                R.id.channel_name, names);
        channel_list = (ListView) findViewById(R.id.channel_list);
        channel_list.setAdapter(adapter);




    }
}

我的问题: 1.在onPostExecute方法中构建适配器是否可以? 2.我应该写另一个synctasck类来下载图像?,或者在doInbackground方法中提取url,然后下载图像,并将这两个图像和名称返回给onPostExecute方法。 实际上我尝试这个,我认为这是非常慢,因为在后台方法解码json是非常慢的! 3.如何在下载名称后构建listView,然后在下载图像后,我只需修改它。 谢谢

1 个答案:

答案 0 :(得分:1)

1:通常是的,虽然你最好制作适配器,然后在post执行后将值传递给它,然后调用adapter.NotifyDataSetChanged();

2:我建议不要重新发明轮子并使用“梦幻般的”毕加索图像加载库

http://square.github.io/picasso/

3:创建一个列表视图,将名称和URL传递给它,将数组适配器变为您自己的自定义,例如“myListAdapter”然后设置名称值,然后使用毕加索下载并将图像加载到您的imageview或其他任何你想用它做的事情。

http://www.vogella.com/tutorials/AndroidListView/article.html#adapterown_custom

E.g。

public class MainActivity extends Activity
{
    ArrayList<String> myListItems = new ArrayList<String>();
    ArrayAdapter<String> adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {

        adapter = new ArrayAdapter(this,R.layout.row_category_layout,R.id.category_name, names);
        //execute my data task

    }


    public void dataTask()
    {

        //GOT SOME DATA
        myListItems.add("MYDATA");
        adapter.notifyDataSetChanged();

    }