这是我的代码: -
public class grabber extends Activity
{
int counter;
String folderPath;
String[] array;
DownloadManager dm;
private long enqueue;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.data);
Down t = new Down();
t.execute();
}
private class Down extends AsyncTask<String, Void, String>
{
protected String doInBackground(String... params)
{
Log.i("grabber", "in back");
String w =Environment.getExternalStorageDirectory().getAbsoluteFile()+"/Android/data/myfolder";
createdir(w);
String link = "http://mywebsitehere.com";
Document doc;
array = new String[200];
try {
doc = Jsoup.connect(link).get();
String title = doc.title();
folderPath = w+ File.separator+title;
createdir(folderPath);
Elements images = doc.select("img[src~=(?i)\\.(png|jpe?g|gif)]");
counter =0;
for (Element image : images)
{
String img = image.attr("src");
array[counter]=img;
counter++;
}
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String result)
{
Toast.makeText(getApplicationContext(),
"done", Toast.LENGTH_SHORT).show();
for(int i=0;i<counter;i++)
{
dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
Request request = new Request(
Uri.parse(array[i]));
request.setDescription("Android Data download using DownloadManager.");
request.setDestinationInExternalFilesDir(getApplicationContext(),folderPath,File.separator+"pic"+Integer.toString(i)+".jpg");
enqueue = dm.enqueue(request);
}
}
}
public void createdir(String Path)
{
File file = new File(Path);
if(!file.exists())
{
file.mkdirs();
}
}
}
它应该做什么: - 它应该将包含图像的给定链接下载到给定路径。
它的作用: -
该应用程序运行得很好,我的UI没有挂起。几秒后“完成”显示Toast,这意味着asynctask
已完成,我们在onPostExecute
。但当我检查目录时,我发现Android/data/myfolder
内没有文件夹。
主要的挫折是有时它起作用,即图像被下载,有时不被下载。
所以我猜它可能是因为一些http超时或一些我无法正确处理的错误,因为我在createdir(folderPath);
之后使用Jsoup
并且错误发生在那里所以没有文件夹得到在那里创造。
任何想法!??在此先感谢。
编辑: - 我在jsoup.connect(link).get();
期间得到SocketTimeoutException
答案 0 :(得分:0)
您必须将以下权限添加到应用程序的清单中,才能写入外部存储。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
我希望你这样做?
答案 1 :(得分:0)
最后,我做了一些试验和错误。
我们可以在这里使用超时选项通过更改
来减少 Sockettimeoutexception doc = Jsoup.connect(link).get();
到
doc = Jsoup.connect(link).timeout(10000).get();
还有一个错误,那就是删除 onPostExecute 中的Toast消息,因为我们无法在没有处理程序从后台任务到UI的情况下进行交互。
那就是它。