我想通过传递一个网址来加载多个图像。与本教程不同http://www.learn2crack.com/2014/06/android-load-image-from-internet.html其中只有一个图像被下载并使用img.setImageBitmap(图像)查看;我的问题是如何将url发送到一个方法以加载该url的图像,该方法返回一个图像,然后我在图像视图中显示它。
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
}
}
}
}
您可以使用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;
}
}
好的,假设出于某种原因,您希望按顺序逐个获取图像,而不是并行获取,并且假设您的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),那么页