Android中的背景图片下载需要帮助吗?

我有一个图像视图,我写过刷卡,在刷卡的时候,图像从互联网上下载,所以我想我必须在刷卡之前在后台下载图像,因为我需要使用asynctask或Service或IntentService,所有这些都有助于下载和存储数据/数据/ mypackages,但仍然在我的情况下刷卡任何想法,也告诉我哪一个是最好的,是我正在以正确的方式调用

asynctask

2.服务

3.意图服务如下图所示,

我很困惑哪一个是正确的方法,因为我的问题仍未解决

这是asynctask代码示例代码段

public class Demo extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new FirstTask().execute(); // calling Asynctask here } 

}

异步任务代码

 private class FirstTask extends AsyncTask { private final ProgressDialog dialog = new ProgressDialog(Catalogue.this); int temp = 0; // can use UI thread here protected void onPreExecute() { this.dialog.setMessage("Loading..."); this.dialog.setCancelable(false); //this.dialog.show(); System.gc(); Toast.makeText(Catalogue.this, "My Async Created", Toast.LENGTH_LONG).show(); } @Override protected Void doInBackground(Void... params) { Looper.prepare(); try { myddownloadmethod();// calling my download method } catch (Exception e) { Util.trace("Error in Async"+e.getMessage()); } Looper.loop(); return null; } protected void onPostExecute(Void result) { if (this.dialog.isShowing()) { Toast.makeText(Catalogue.this, "My Async destroyed", Toast.LENGTH_LONG).show(); Toast.makeText(Catalogue.this, "count" + temp, Toast.LENGTH_LONG).show(); this.dialog.dismiss(); } } } 

这是我的服务

 public class MyService extends Service implements Runnable { @Override public void onCreate() { super.onCreate(); Thread mythread = new Thread(this); mythread.start(); } public void run() { Looper.prepare(); try { myddownloadmethod();// calling my download method } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } Looper.loop(); } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } } Invoking Service public class ServicesDemo extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); startService(new Intent(this, MyService.class)); } } 

这是IntentService代码

 public class Downloader extends IntentService { public Downloader() { super("Downloader"); } @Override public void onCreate() { super.onCreate(); } @Override public void onDestroy() { super.onDestroy(); } @Override public void onHandleIntent(Intent i) { try { myddownloadmethod();// calling my download method } catch (Exception e1) { // TODO Auto-generated catch block Log.d("Error",e1.getMessage()); } } } 

从MyActivity调用IntentService

 public class ServicesDemo extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent i1=new Intent(this, Downloader.class); startService(i1); } } 

使用像我从服务器下载文件并放入SD卡的服务下载它的最佳方式也使用通知。 它是相当长的代码,但我认为完美的一个,如果不明白任何事情,那么请去android开发者博客的服务。

 public class DownloadService extends Service{ SharedPreferences preferences; private static final String DOCUMENT_VIEW_STATE_PREFERENCES = "DjvuDocumentViewState"; private Looper mServiceLooper; private ServiceHandler mServiceHandler; private NotificationManager mNM; String downloadUrl; public static boolean serviceState=false; // Handler that receives messages from the thread private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { downloadFile(); showNotification(getResources().getString(R.string.notification_catalog_downloaded),"VVS"); stopSelf(msg.arg1); } } @Override public void onCreate() { serviceState=true; mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); HandlerThread thread = new HandlerThread("ServiceStartArguments",1); thread.start(); // Get the HandlerThread's Looper and use it for our Handler mServiceLooper = thread.getLooper(); mServiceHandler = new ServiceHandler(mServiceLooper); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d("SERVICE-ONCOMMAND","onStartCommand"); Bundle extra = intent.getExtras(); if(extra != null){ String downloadUrl = extra.getString("downloadUrl"); Log.d("URL",downloadUrl); this.downloadUrl=downloadUrl; } Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; mServiceHandler.sendMessage(msg); // If we get killed, after returning from here, restart return START_STICKY; } @Override public void onDestroy() { Log.d("SERVICE-DESTROY","DESTORY"); serviceState=false; //Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show(); } @Override public IBinder onBind(Intent intent) { // We don't provide binding, so return null return null; } public void downloadFile(){ downloadFile(this.downloadUrl,fileName); } void showNotification(String message,String title) { // In this sample, we'll use the same text for the ticker and the expanded notification CharSequence text = message; // Set the icon, scrolling text and timestamp Notification notification = new Notification(R.drawable.icon, "vvs", System.currentTimeMillis()); notification.flags |= Notification.FLAG_AUTO_CANCEL; Intent intent = new Intent(this, HomeScreenActivity.class); intent.setFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP); //The PendingIntent to launch our activity if the user selects this notification PendingIntent contentIntent = PendingIntent.getActivity(this.getBaseContext(), 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); // Set the info for the views that show in the notification panel. notification.setLatestEventInfo(this, title, text, contentIntent); // Send the notification. // We use a layout id because it is a unique number. We use it later to cancel. mNM.notify(R.string.app_name, notification); } public void downloadFile(String fileURL, String fileName) { StatFs stat_fs = new StatFs(Environment.getExternalStorageDirectory().getPath()); double avail_sd_space = (double)stat_fs.getAvailableBlocks() *(double)stat_fs.getBlockSize(); //double GB_Available = (avail_sd_space / 1073741824); double MB_Available = (avail_sd_space / 10485783); //System.out.println("Available MB : " + MB_Available); Log.d("MB",""+MB_Available); try { File root =new File(Environment.getExternalStorageDirectory()+"/vvveksperten"); if(root.exists() && root.isDirectory()) { }else{ root.mkdir(); } Log.d("CURRENT PATH",root.getPath()); URL u = new URL(fileURL); HttpURLConnection c = (HttpURLConnection) u.openConnection(); c.setRequestMethod("GET"); c.setDoOutput(true); c.connect(); int fileSize = c.getContentLength()/1048576; Log.d("FILESIZE",""+fileSize); if(MB_Available <= fileSize ){ this.showNotification(getResources().getString(R.string.notification_no_memory),getResources().getString(R.string.notification_error)); c.disconnect(); return; } FileOutputStream f = new FileOutputStream(new File(root.getPath(), fileName)); InputStream in = c.getInputStream(); byte[] buffer = new byte[1024]; int len1 = 0; while ((len1 = in.read(buffer)) > 0) { f.write(buffer, 0, len1); } f.close(); File file = new File(root.getAbsolutePath() + "/" + "some.pdf"); if(file.exists()){ file.delete(); Log.d("FILE-DELETE","YES"); }else{ Log.d("FILE-DELETE","NO"); } File from =new File(root.getAbsolutePath() + "/" + fileName); File to = new File(root.getAbsolutePath() + "/" + "some.pdf"); } catch (Exception e) { Log.d("Downloader", e.getMessage()); } 

对于后来遇到此问题的任何人,请查看项目com.example.android.bitmapfun.ui.ImageGridActivity的android示例代码中使用的异步下载机制。 它以异步方式下载图像,并将它们缓存在ImageView中进行离线显示。 人们围绕这个代码包装了他们的代码并使他们自己的图像加载库。 这些库使用AsyncTask而不是服务。 预计异步任务将在几秒钟内完成工作。

如果您想下载更大的内容,我建议使用自API 9以来可用的DownloadManager而不是使用服务。 这里有很多代码可以增加下载的弹性。

下载管理器是一种处理长时间运行的HTTP下载的系统服务。 客户端可以请求将URI下载到特定目标文件。 下载管理器将在后台进行下载,负责HTTP交互并在发生故障或连接更改和系统重新启动后重试下载。 应通过传递DOWNLOAD_SERVICE,通过getSystemService(String)获取此类的实例。 请求通过此API下载的应用程序应注册ACTION_NOTIFICATION_CLICKED的广播接收器,以便在用户单击通知中的正在运行的下载时或从下载UI中进行适当处理。 请注意,应用程序必须具有INTERNET权限才能使用此类。

你可能已经过度工程了。 我已经实现了动态加载图像的滑动,我只是使用一个简单的实用程序类,通过静态方法调用为我完成所有操作。 试试这堂课:

 package com.beget.consumer.util; /* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ import java.io.IOException; import java.io.InputStream; import java.lang.ref.WeakReference; import java.net.MalformedURLException; import java.util.HashMap; import java.util.Map; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; import android.util.Log; import android.widget.ImageView; public class DrawableLoader { private final Map drawableMap; private WeakReference imageViewReference; public DrawableLoader() { drawableMap = new HashMap(); } public Drawable fetchDrawable(String urlString) { if (drawableMap.containsKey(urlString)) { return drawableMap.get(urlString); } Log.d(this.getClass().getSimpleName(), "image url:" + urlString); try { InputStream is = fetch(urlString); Drawable drawable = Drawable.createFromStream(is, "src"); drawableMap.put(urlString, drawable); Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", " + drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", " + drawable.getMinimumHeight() + "," + drawable.getMinimumWidth()); return drawable; } catch (MalformedURLException e) { Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e); return null; } catch (IOException e) { Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e); return null; } } public void fetchDrawableOnThread(final String urlString, final ImageView imageView) { imageViewReference = new WeakReference(imageView); if (drawableMap.containsKey(urlString)) { imageViewReference.get().setImageDrawable(drawableMap.get(urlString)); } final Handler handler = new Handler() { @Override public void handleMessage(Message message) { imageViewReference.get().setImageDrawable((Drawable) message.obj); } }; Thread thread = new Thread() { @Override public void run() { //TODO : set imageView to a "pending" image Drawable drawable = fetchDrawable(urlString); Message message = handler.obtainMessage(1, drawable); handler.sendMessage(message); } }; thread.start(); } private InputStream fetch(String urlString) throws MalformedURLException, IOException { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpGet request = new HttpGet(urlString); HttpResponse response = httpClient.execute(request); return response.getEntity().getContent(); } } 

这就是你所需要的。 然后,当您需要加载图像时,您可以调用:

 fetchDrawableOnThread("http://img.androidcookie.com/android/image.jpg", yourImageViewReference); 

而已。
如果您有来自JSON对象的URL,请将URL解析为字符串,以便:
String url = jsonObj.getString("url"); 然后调用fetchDrawableOnThread(url, yourImageViewReference);

使用齐射。 使用凌空网络图像视图,您可以执行此操作

我们在这里使用最新的architecure组件。我们为一些表示下载状态的标志的实时数据做了一些观察。在服务中我们下载图像并完成更新实时数据,以便观察者方法自动调用