AsyncTask无法从外部站点下载文件

时间:2013-04-08 09:32:06

标签: android android-asynctask

我正在开发我的第一款Android应用,但似乎无法使其正常运行。这个应用程序应该点击一个站点(在这种情况下,我的个人网站)下载一个文件(一个pdf,具体),并将其保存在SDCard上。 我环顾四周,发现我应该为此目的使用AsyncTask,这是我提出的代码:

package it.uniroma3.tirocinioandroid;

import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {

    private Button dlbutton;
    private ProgressDialog mProgressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        dlbutton = (Button) findViewById(R.id.dlbutton);
        dlbutton.setOnClickListener(this);
        mProgressDialog = new ProgressDialog(MainActivity.this);
        mProgressDialog.setMessage("Currently downloading...");
        mProgressDialog.setIndeterminate(false);
        mProgressDialog.setMax(100);
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        Log.i("Main", "finito onCreate");

    } 

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //TODO sistemare il menù
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


    @Override
    public void onClick(View v) {
        switch (v.getId())
        {
        case R.id.dlbutton:
            DownloadFile downloadFile = new DownloadFile();
            downloadFile.execute("http://dragon-nest.net/catalogo.pdf");
            Log.i("Main", "finito onClik");
            break;
        }

    }

    private class DownloadFile extends AsyncTask<String, Integer, String> {
        @Override
        protected String doInBackground(String... sUrl) {
            try {
                URL url = new URL(sUrl[0]);
                URLConnection connection = url.openConnection();
                connection.connect();
                Log.i("Main", "connected");
                // this will be useful so that you can show a typical 0-100% progress bar
                int fileLength = connection.getContentLength();

                // download the file
                InputStream input = new BufferedInputStream(url.openStream());
                Log.i("Main", "input set");
                OutputStream output = new FileOutputStream(Environment.getDataDirectory().getAbsolutePath().concat("download/catalogo.pdf"));
                Log.i("Main", "output set");

                byte data[] = new byte[1024];
                long total = 0;
                int count;
                while ((count = input.read(data)) != -1) {
                    total += count;
                    // publishing the progress....
                    publishProgress((int) (total * 100 / fileLength));
                    output.write(data, 0, count);
                }

                output.flush();
                output.close();
                input.close();
            }catch(Exception e){
                    Log.e("ERROR_TAG", e.getMessage());
                    return "fine";
                }
            String s ="fine";
            Log.i("Main", "end download");
            return s;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mProgressDialog.show();
            Log.i("Main", "end preExecute");
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            mProgressDialog.dismiss();
            Log.i("Main", "end postExecute");
        }

        @Override
        protected void onProgressUpdate(Integer... progress) {
            super.onProgressUpdate(progress);
            mProgressDialog.setProgress(progress[0]);
            Log.i("Main", "update...");
        }


    }
}

但是,似乎无法连接到该站点以开始下载。从Logcat开始,它显示它在尝试连接时会生成异常并在下载真正开始之前阻塞所有内容。

以下是该应用的清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="it.uniroma3.tirocinioandroid"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <user-permission android:name="android.permission.INTERNET" />
    <user-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="it.uniroma3.tirocinioandroid.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="it.uniroma3.tirocinioandroid.FileDownloader"
            android:label="@string/title_activity_file_downloader" >
        </activity>
    </application>

</manifest>

顺便说一句,我试着看看是不是我的网站表现得很时髦,但我可以从浏览器下载文件就好了。我也试过了另一个网站的另一个文件,但我遇到了同样的问题。 AVD和我的平板电脑都出现了这种情况,所以我不认为这是与AVD相关的问题。

3 个答案:

答案 0 :(得分:0)

试试......这个

而不是catch语句

catch(Exception e){
                Log.e("ERROR_TAG", e.getMessage());
                return "fine";
            }

通过

捕获特定的异常,例如IOEXCEPTION或任何其他异常
catch(Exception e)

语句异步任务捕获已发生的所有异常

答案 1 :(得分:0)

您的清单中有错误。没有<user-permission>这样的标记,请将其更改为<uses-permission>

如果这样做无法帮助您将connection的声明更改为HttpURLConnection,请按照以下方式使用它:

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

我认为这不是非常重要,但是我这样使用它并且每次都有效(根据声明的协议方案,可能需要转换为HttpsURLConnection)。

答案 2 :(得分:0)

此代码与我合作!

 protected class myClass extends AsyncTask{
  @Override
protected Object doInBackground(Object... arg0) {
    // TODO Auto-generated method stub  
    try{

        File cacheDir = new  File(android.os.Environment.getExternalStorageDirectory(),"FolderName");
        if(!cacheDir.exists())
           cacheDir.mkdirs();
        File f=new File(cacheDir,"q.mp3");
         text1.setText("file");
        URL url = new URL("your link"); 
        InputStream input = new BufferedInputStream(url.openStream());
        OutputStream output = new FileOutputStream(f);

                    byte data[] = new byte[1024];
                    long total = 0;
                    int count=0;
                                while ((count = input.read()) != -1) {
                        total++;
                       Log.e("while","A"+total);

                        output.write(data, 0, count);
                    }

                    output.flush();
                    output.close();
                    input.close();

        }

    catch (Exception e) { 
                  e.printStackTrace();}

    return null;
}

}