我试图用asyncTask下载一个文件,但是没有工作,没有错误消息或什么都没有,只是不下载文件…我尝试了一切,但它似乎没有进入的同时…任何人都知道什么可以是问题?我在手机上测试过,网址也可以.
class DownloadFileFromURL extends AsyncTask<String,String,String> { /** * Before starting background thread * */ @Override protected void onPreExecute() { super.onPreExecute(); System.out.println("Starting download"); } /** * Downloading file in background thread * */ @Override protected String doInBackground(String... f_url) { int count; try { String root = Environment.getExternalStorageDirectory().toString(); System.out.println("Downloading"); URL url = new URL(f_url[0]); URLConnection conection = url.openConnection(); conection.connect(); // getting file length int lenghtOfFile = conection.getContentLength(); // input stream to read file - with 8k buffer InputStream input = new BufferedInputStream(url.openStream(),8192); // Output stream to write file OutputStream output = new FileOutputStream(root+"/downloadedfile.jpg"); byte data[] = new byte[1024]; long total = 0; while ((count = input.read(data)) != -1) { total += count; // writing data to file output.write(data,count); } // flushing output output.flush(); // closing streams output.close(); input.close(); } catch (Exception e) { Log.e("Error: ",e.getMessage()); } return null; } /** * After completing background task * **/ @Override protected void onPostExecute(String file_url) { System.out.println("Downloaded"); } }
解决方法
我只是运行你的代码,它对我来说很好.图像已下载到SD卡.
请注意,请确保您在AndroidManifest.xml中设置了以下权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
这是我得到的日志(注意我添加了ProgressDialog):
03-21 16:53:46.422 21017-21017/com.imagedownload.danielnugent.imagedownload D/Activity﹕ #1 setTransGradationModeColor false 03-21 16:53:56.211 21017-21017/com.imagedownload.danielnugent.imagedownload D/Activity﹕ #1 setTransGradationModeColor false 03-21 16:54:06.441 21017-21017/com.imagedownload.danielnugent.imagedownload I/System.out﹕ Starting download 03-21 16:54:06.441 21017-21017/com.imagedownload.danielnugent.imagedownload D/Dialog﹕ checkMirrorLinkEnabled returns : false 03-21 16:54:06.441 21017-21017/com.imagedownload.danielnugent.imagedownload D/Dialog﹕ showing allowed 03-21 16:54:06.461 21017-25126/com.imagedownload.danielnugent.imagedownload I/System.out﹕ Downloading 03-21 16:54:06.461 21017-21017/com.imagedownload.danielnugent.imagedownload D/Activity﹕ #1 setTransGradationModeColor false 03-21 16:54:06.481 21017-21017/com.imagedownload.danielnugent.imagedownload D/ProgressBar﹕ updateDrawableBounds: left = 0 03-21 16:54:06.481 21017-21017/com.imagedownload.danielnugent.imagedownload D/ProgressBar﹕ updateDrawableBounds: top = 0 03-21 16:54:06.491 21017-21017/com.imagedownload.danielnugent.imagedownload D/ProgressBar﹕ updateDrawableBounds: right = 144 03-21 16:54:06.491 21017-21017/com.imagedownload.danielnugent.imagedownload D/ProgressBar﹕ updateDrawableBounds: bottom = 144 03-21 16:54:11.596 21017-21017/com.imagedownload.danielnugent.imagedownload I/System.out﹕ Downloaded
为了防止这有用,这里是完整的MainActivity.java代码,对我有用. (url是占位符):
import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Environment; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import java.io.BufferedInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.net.URLConnection; public class MainActivity extends ActionBarActivity { private ProgressDialog pDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new DownloadFileFromURL().execute("http://www.example.com/IMG.jpg"); } @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); } class DownloadFileFromURL extends AsyncTask<String,String> { /** * Before starting background thread * */ @Override protected void onPreExecute() { super.onPreExecute(); System.out.println("Starting download"); pDialog = new ProgressDialog(MainActivity.this); pDialog.setMessage("Loading... Please wait..."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); pDialog.show(); } /** * Downloading file in background thread * */ @Override protected String doInBackground(String... f_url) { int count; try { String root = Environment.getExternalStorageDirectory().toString(); System.out.println("Downloading"); URL url = new URL(f_url[0]); URLConnection conection = url.openConnection(); conection.connect(); // getting file length int lenghtOfFile = conection.getContentLength(); // input stream to read file - with 8k buffer InputStream input = new BufferedInputStream(url.openStream(),8192); // Output stream to write file OutputStream output = new FileOutputStream(root+"/downloadedfile.jpg"); byte data[] = new byte[1024]; long total = 0; while ((count = input.read(data)) != -1) { total += count; // writing data to file output.write(data,count); } // flushing output output.flush(); // closing streams output.close(); input.close(); } catch (Exception e) { Log.e("Error: ",e.getMessage()); } return null; } /** * After completing background task * **/ @Override protected void onPostExecute(String file_url) { System.out.println("Downloaded"); pDialog.dismiss(); } } }