普通网友 2016-03-12 12:51 采纳率: 100%
浏览 1825

安卓,子线程获取网络图片,发消息给主线程,主线程用图片填充listview,出错

先上logcat:
图片说明

我的xml布局就是一个按钮,和一个listview,listview里就一个imageview,按下按钮开始从网络获取图片,然后发消息到主线程,然后listview就填充数据。xml代码就不贴了。

以下是mainactivity

 public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    Button but;

    Bitmap bitmap;

    ListView listView;
    Bitmap mainBitmap;
    MainHandler mainHandler=new MainHandler();
    List<Map<String,Bitmap>> list=new ArrayList<>();
    Map<String,Bitmap> map;
    Message sendMsg;
    List<Bitmap> bitmapList=new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        but=(Button)super.findViewById(R.id.but);

        img=(ImageView)super.findViewById(R.id.img);
        listView=(ListView)super.findViewById(R.id.listview);

        but.setOnClickListener(this);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void onClick(View v)
    {
        new Thread() {
            public void run() {

               List<String> imageList=new ArrayList<>();
                imageList.add("http://i1.hdslb.com/u_user/ed5c9f35b1311b3606c29d633793690b.png");
                imageList.add("http://i1.hdslb.com/u_user/cfdf3c751a554873ecf4687616e1f858.jpg");
                imageList.add("http://i1.hdslb.com/u_user/1462ad43f88a4b6e8b32da2447479f23.jpg");
                try
                {
                    Looper.prepare();

                    for(int i=0;i<imageList.size();i++) {
                        URL uri = new URL(imageList.get(i));
                        HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection();
                        httpURLConnection.setConnectTimeout(5000);
                        httpURLConnection.setUseCaches(false);
                        httpURLConnection.setDoInput(true);
                        InputStream inputStream = httpURLConnection.getInputStream();
                        bitmap = BitmapFactory.decodeStream(inputStream);
                        bitmapList.add(bitmap);
                       }


                    Message sendFinishMessage=Message.obtain();
                    sendFinishMessage.what=2;
                    mainHandler.sendMessage(sendFinishMessage);
                    Looper.loop();

                } catch (Exception e)

                {
                    Log.e("this", "获取网络图片失败" + e);
                }
            }
        }.start();


    }

    class MainHandler extends Handler
    {
        public void handleMessage(Message msg)
        {

            if(msg.what ==2)
            {
                for(int i=0;i<bitmapList.size();i++)
                {

                    map=new HashMap<>();
                    map.put("image",bitmapList.get(i));
                    list.add(map);
                }
                initListView();
            }
        }
    }

    public void initListView()
    {
        SimpleAdapter simpleAdapter=new SimpleAdapter(this,list,R.layout.listview,new String[]{"image"},new int[]{R.id.imageview2});
        listView.setAdapter(simpleAdapter);
    }

}

代码如上,请问是哪里出了问题?

  • 写回答

2条回答

  • mofaji 2016-03-13 08:36
    关注

    看到 日志输出 说找不到文件 应该是在获取网络的图片decode 成bitmap的时候出错
    URL uri = new URL(imageList.get(i));
    HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection();
    httpURLConnection.setConnectTimeout(5000);
    httpURLConnection.setUseCaches(false);
    httpURLConnection.setDoInput(true);
    InputStream inputStream = httpURLConnection.getInputStream();
    bitmap = BitmapFactory.decodeStream(inputStream);
    bitmapList.add(bitmap);

    看来应该是这片代码的问题

    评论

报告相同问题?

悬赏问题

  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型