当前位置: 首页 > 知识库问答 >
问题:

如何在AsyncTask中加载多个图像

韩楷
2023-03-14

我想通过传递一个网址来加载多个图像。与本教程不同http://www.learn2crack.com/2014/06/android-load-image-from-internet.html其中只有一个图像被下载并使用img.setImageBitmap(图像)查看;我的问题是如何将url发送到一个方法以加载该url的图像,该方法返回一个图像,然后我在图像视图中显示它。

共有3个答案

庞瀚
2023-03-14
private void GetMultipleImages() {
        HttpGet httpGet = null;
        try {
            httpGet = new HttpGet(new URI("URL"));
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

        RestTask task = new RestTask(getActivity(), ACTION_FOR_INTENT_CALLBACK);
        task.execute(httpGet);
    }



private class RestTask extends AsyncTask<HttpUriRequest, Void, String>
        {
            private static final String TAG = "AARestTask";
            public static final String HTTP_RESPONSE = "httpResponse";

            private Context mContext;
            Activity context;
            private HttpClient mClient;
            private String mAction;

            public RestTask(Context context, String action)
                    {
                        mContext = context;
                        mAction = action;
                        mClient = new DefaultHttpClient();
                    }

            public RestTask(FragmentActivity activity, String action, HttpClient client)
                    {
                        mContext = context;
                        mAction = action;
                        mClient = client;
                    }

            @Override
            protected String doInBackground(HttpUriRequest... params)
            {
                try
                {
                    HttpUriRequest request = params[0];
                    HttpResponse serverResponse = mClient.execute(request);
                    BasicResponseHandler handler = new BasicResponseHandler();
                    return handler.handleResponse(serverResponse);
                }
                catch (Exception e)
                {
                    // TODO handle this properly
                    e.printStackTrace();
                    return "";
                }
            }


            @Override
            protected void onPostExecute(String result)
            {
                Log.e(TAG, "RESULT = " + result);
                /*Intent intent = new Intent(mAction);
                intent.putExtra(HTTP_RESPONSE, result);
                mContext.sendBroadcast(intent);*/

                JSONObject jObject;
                try {
                    jObject = new JSONObject(result);

                    JSONArray jSearchData = jObject.getJSONArray("data");

                    for (int i = 0; i < jSearchData.length(); i++) {

                        JSONObject objJson = jSearchData.getJSONObject(i);

                        String data = objJson.getString("id");
                        String imagesData = objJson.getString("images");

                        JSONArray jsonImages = new JSONArray("[" + imagesData + "]");

                        JSONObject imageObject = jsonImages.getJSONObject(0);

                        String images = imageObject.getString("thumbnail");

                        JSONArray imageArray = new JSONArray("[" + images + "]");

                        JSONObject urlObject = imageArray.getJSONObject(0);

                        String url = urlObject.getString("url");

                        urlArrayList.add(url);

                    }
                    imageAdapter = new InstaImageAdapter(getActivity(),urlArrayList);
                    Log.e("imageAdapter ==>",""+imageAdapter);
                    RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getActivity(),4);
                    rvInstagramImage = (RecyclerView)getActivity().findViewById(R.id.rv_insta_img);
                    rvInstagramImage.setLayoutManager(layoutManager);
                    rvInstagramImage.setItemAnimator(new DefaultItemAnimator());
                    rvInstagramImage.addItemDecoration(new ItemOffsetDecoration(getActivity(), R.dimen.item_offset));
                    rvInstagramImage.setAdapter(imageAdapter);
                } catch (Exception e) {
                    // TODO: handle exception
                }

            }

    }
}
西门磊
2023-03-14

您可以使用android Volley库下载图像。

将volley.jar库添加到您的项目中

使用截击的图像请求https://developer.android.com/training/volley/request.html#request-图像

如果要在gridView/ListView中显示图像。

使用

<com.android.volley.toolbox.NetworkImageView
    android:id="@+id/networkImageView"
    android:layout_width="150dp"
    android:layout_height="170dp"
    android:layout_centerHorizontal="true" />

在grid_项中。xml或list_项。xml

在ListAdapter的getView中

@Override
public View getView(int position, View convertView, ViewGroup parent) {
  // Get the NetworkImageView that will display the image.
  mNetworkImageView = (NetworkImageView) findViewById(R.id.networkImageView);

  // Get the ImageLoader through your singleton class.
  mImageLoader = MySingleton.getInstance(this).getImageLoader();

  // Set the URL of the image that should be loaded into this view, and
  // specify the ImageLoader that will be used to make the request.
  mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader);
}



private static MySingleton mInstance;
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
private static Context mCtx;

private MySingleton(Context context) {
    mCtx = context;
    mRequestQueue = getRequestQueue();

    mImageLoader = new ImageLoader(mRequestQueue,
            new ImageLoader.ImageCache() {
        private final LruCache<String, Bitmap>
                cache = new LruCache<String, Bitmap>(20);

        @Override
        public Bitmap getBitmap(String url) {
            return cache.get(url);
        }

        @Override
        public void putBitmap(String url, Bitmap bitmap) {
            cache.put(url, bitmap);
        }
    });
}

public static synchronized MySingleton getInstance(Context context) {
    if (mInstance == null) {
        mInstance = new MySingleton(context);
    }
    return mInstance;
}

public RequestQueue getRequestQueue() {
    if (mRequestQueue == null) {
        // getApplicationContext() is key, it keeps you from leaking the
        // Activity or BroadcastReceiver if someone passes one in.
        mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
    }
    return mRequestQueue;
}

public <T> void addToRequestQueue(Request<T> req) {
    getRequestQueue().add(req);
}

public ImageLoader getImageLoader() {
    return mImageLoader;
}
}
司空锋
2023-03-14

好的,假设出于某种原因,您希望按顺序逐个获取图像,而不是并行获取,并且假设您的URL位于列表、数组等中,请修改教程示例,以便onPostExecute调用活动中的方法,该方法可以在回调接口中定义,也可以在类本身上定义,对于每个迭代,从列表中选择一个元素,并在前一个任务完成时启动一个新的LoadImage作业。

示例(未测试)代码:

public class MainActivity extends Activity {
  Button load_img;
  ImageView img;
  Bitmap bitmap;
  ProgressDialog pDialog;
  private List<String> mURLs = new LinkedList<String>();
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    load_img = (Button)findViewById(R.id.load);
    img = (ImageView)findViewById(R.id.img);
    load_img.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View arg0) {
        // TODO Auto-generated method stub
         mURLs.add("http://www.learn2crack.com/wp-content/uploads/2014/04/node-cover-720x340.png");
         mURLs.add("some-other-URL");

         loadNext();
      }
    });

    private void loadNext() {
        String url = mURLs.remove();
        if (url != null) {
            new LoadImage().execute(url);
        }
    }
  }
  private class LoadImage extends AsyncTask<String, String, Bitmap> {
    @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Loading Image ....");
            pDialog.show();
    }
       protected Bitmap doInBackground(String... args) {
         try {
               bitmap = BitmapFactory.decodeStream((InputStream)new URL(args[0]).getContent());
        } catch (Exception e) {
              e.printStackTrace();
        }
      return bitmap;
       }
       protected void onPostExecute(Bitmap image) {
         if(image != null){
           img.setImageBitmap(image);
           pDialog.dismiss();
         }else{
           pDialog.dismiss();
           Toast.makeText(MainActivity.this, "Image Does Not exist or Network Error", Toast.LENGTH_SHORT).show();
         }

         loadNext();
       }
   }
}

在这个例子中,我反复将图像设置到同一个ImageView上,这显然毫无意义。显然,您必须跟踪哪个图像进入哪个imageview,方法是将imageview作为参数发送给任务,或者将imageview(或其R.id.xxx id并相应地调用findById)也保留在一个数组中,或者保留一个计数器,或者。。。。有一百万种方法可以解决这个问题。

另一种方法是将数组发送到AsyncTask,让doInBackground简单地使用for循环或类似循环在数组上循环。

但是请注意,更好的方法可能是实际并行化任务,以便您确保充分利用可用的网络带宽来并行获取图像。

 类似资料:
  • 问题内容: 当有人通过我的应用程序工作时,我正在尝试在后台加载图像。我写的逻辑是这样的: 但是,当我尝试启动这样的新线程时: 但是在程序中我得到错误Looper.prepare必须被调用,随后是逻辑looper.quit() 但是,当我添加Looper.prepare()时,似乎中断了程序,并且没有要调用的looper.quit()。 我是否正确创建任务? 编辑: 这是我尝试运行时的错误日志: 我

  • 我创建了一个扩展AsyncTask的AsynTaskInsideActivity类 位置\u id 我想从每一列中提取记录。因此,为了存储每个列的每个记录,我创建了四个类型数组(即每列一个),并成功地将检索到的光标数据存储在每个数组中。现在,问题是我需要返回每一列的记录。因此,具体地说,我如何从one-AsyncTask类返回这四个单独的List-type数组。目前,我只返回列表类型的数组,即lo

  • 我试了几个解决方案,为了前任。HTTPS/SSL上的Java客户端证书或获取javax.net.ssl.sslHandShakeException:收到致命警报:handshake_failure错误,从.p12文件中收到的证书和从浏览器导出的证书都不起作用... 更新2: 我尝试了以下方法:https://stackoverflow.com/a/11908693/1215791,并设法访问了Se

  • 问题内容: 我需要以简单的Java独立应用程序从Web加载图像。有任何想法吗? 问题答案: 这足以启动您吗?不知道您要从那里做什么。

  • 问题内容: 主要代号 2.MovieAdapter.java //我可以成功显示除图片以外的所有数据 //图片链接带有“ posterpath”键 //告诉我如何在MovieAdapter的Viewholder中加载图像 // currentmovie只是一个getter和setter类 3.当前电影 问题答案: 我正在使用该库并通过以下方式加载图像 首先通过创建显示选项对象 然后通过以下方式初始

  • 我想做一个reactjs页面懒惰加载图像。因此,我调用lazyLoadImages()内部的组件didMount()。我发现位于浏览器选项卡的浏览器加载指示器仍然一路旋转,直到加载所有图像。这让我认为我所做的并没有提供真正的懒惰加载图像体验。 有趣的是,如果我在setTimeout中用一个不太短的timeout参数包装lazyLoadImages(),例如100ms(不是0或甚至50ms),那么页