【问题标题】:Network error when loading an Image from URL [duplicate]从 URL 加载图像时出现网络错误 [重复]
【发布时间】:2014-12-26 12:42:17
【问题描述】:

我正在从 URL 加载图像,将其转换为位图,然后将其添加到地图中的标记中。我有两个标记,一个用于我的个人资料,另一个用于朋友个人资料。

当我加载图像时,我收到以下错误并且图像没有被加载。也没有强制关闭。

 android.os.NetworkOnMainThreadException

我不确定这是什么错误。

这是我正在尝试的代码:以下相同的代码适用于我的个人资料图片。只有当我尝试加载我的朋友列表时才会出现这种情况。

我在里面调用下面的 for 循环。

for (int i = 0; i < friendsList.size(); i++)
{
    userName = friendsList.get(i).getName();
    lati = friendsList.get(i).getLati();
    longi = friendsList.get(i).getLongi();
    photoUrl = friendsList.get(i).getImage();

    loadMyFriendsLocation(Double.parseDouble(lati), Double.parseDouble(longi), userName, photoUrl, 15);
}

而loadmyfriendsloaction方法有以下内容:

 View marker =  getActivity().getLayoutInflater().inflate(R.layout.activity_myfriendslocationmap, null);
 ImageView friendImageView = (ImageView) marker.findViewById(R.id.badge);

        try 
        {
            InputStream in = new java.net.URL(urlfriends).openStream();
            Bitmap mIcon11 = BitmapFactory.decodeStream(in);
            friendImageView.setImageBitmap(mIcon11);
        }
        catch (Exception e) 
        {
            Log.e("Error", "Message"+e);
            e.printStackTrace();
        }

        //TO CONVERT A VIEW INTO BITMAP
        marker.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),  MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        marker.layout(0, 0, marker.getMeasuredWidth(),marker.getMeasuredHeight());
        final Bitmap icon = Bitmap.createBitmap(marker.getMeasuredWidth(), marker.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(icon);
        marker.draw(canvas);

        MarkerOptions markerOptionsforfriends = new MarkerOptions().position(position).icon(BitmapDescriptorFactory.fromBitmap(icon)).title(uname).anchor(0.5f, 1f);
        markerforfriends = googleMap.addMarker(markerOptionsforfriends);

我在这里完全空白我不知道这可能会出错,因为我的个人资料图片出现了相同的代码,但朋友的照片没有出现......

有人可以帮我解决这个问题吗?

谢谢!

【问题讨论】:

  • 在线程中下载图片或使用AsyncTask...
  • 在我的情况下,我不能使用 AsyncTask 我将在哪里将视图转换为位图?
  • 你可以使用AsyncTask
  • @CapDroid: 在哪个部分将视图转换为位图?
  • @TheDevMan convert view to bitmap 不会导致这个错误,这个错误是因为你在主线程上调用网络操作,所以在线程中进行网络操作。

标签: android google-maps google-maps-markers google-maps-api-2


【解决方案1】:

当应用程序尝试在其主线程上执行网络操作时会引发此异常。所以必须在下面使用:-

  1. 线程

    Thread thread = new Thread(new Runnable(){
        @Override
        public void run() {
            try {
                //Your code goes here
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
    
    thread.start(); 
    
  2. 异步任务

    private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {
      //your code goes here
      return response;
    }
    
    @Override
    protected void onPostExecute(String result) {
      textView.setText(result);
    }
    

    }

  3. StrictMode.ThreadPolicy

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    
    StrictMode.setThreadPolicy(policy); 
    

【讨论】:

    【解决方案2】:

    如果你从网络或数据库中获取图像,那么你可以通过这种方式获取

    来自网络

    try { 
           Bitmap bitmap=null; 
           URL imageUrl = new URL(url); 
           HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection(); 
           conn.setConnectTimeout(30000); 
           conn.setReadTimeout(30000); 
           conn.setInstanceFollowRedirects(true); 
           InputStream is=conn.getInputStream(); 
           OutputStream os = new FileOutputStream(f); 
           Utils.CopyStream(is, os); 
           os.close(); 
           bitmap = decodeFile(f); 
           return bitmap; 
     } catch (Exception ex){ 
     ex.printStackTrace(); 
     return null; 
     } 
     } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多