简体   繁体   English

Android-Spinner异步下载无法正常运行

[英]Android - Spinner async download does not function correctly

Upon activation of any button in the spinner the progress dialog comes up but nothing happens. 激活微调器中的任何按钮后,将显示进度对话框,但没有任何反应。 I had this working perfectly with buttons but don't understand what is wrong here when transitioning to spinners. 我使用按钮可以完美地使用它,但是在过渡到微调器时不明白这里出了什么问题。 Anyone spot the reason why the download doesn't start up correctly? 有人发现下载无法正确启动的原因吗?

public class SpinnerActivity extends Activity {

public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
private ProgressDialog mProgressDialog;

Spinner spDownloadFrom;
private ArrayAdapter<CharSequence> spinnerArrayAdapter;
String url[] = {"http://www.becker.cl/bases.pdf",
        "http://www.pitt.edu/documents/campusmap0607.pdf", "http://www.aara.ca/reg3317/web_page_doc.pdf",
        "www.dataprotection.ie/documents/guidance/GuidanceFinance.pdf", "http://www.fmbb2012.com/JumpingQualifica1.pdf",
        "http://www.consulatdumaroc.ca/coloniefh22012.pdf", "http://www.rgrdlaw.com/media/cases/140_Complaint.pdf" };
String name[] = { "bases.pdf", "campusmap0607.pdf", "web_page_doc.pdf", "GuidanceFinance.pdf",
        "JumpingQualifica1.pdf", "coloniefh22012.pdf", "140_Complaint.pdf", };

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mProgressDialog = new ProgressDialog(SpinnerActivity.this);
    mProgressDialog.setMessage("Please be patient, file downloading...");
    mProgressDialog.setIndeterminate(false);
    mProgressDialog.setMax(100);
    mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

    spDownloadFrom = (Spinner) findViewById(R.id.Spinner01);

    spinnerArrayAdapter = new ArrayAdapter<CharSequence>(this,
            android.R.layout.simple_spinner_item, name);
    spinnerArrayAdapter
            .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spDownloadFrom.setAdapter(spinnerArrayAdapter);

    spDownloadFrom.setOnItemSelectedListener(new SpinnerListener(
            spDownloadFrom));
}

public class SpinnerListener implements OnItemSelectedListener {
    Spinner sp;

    public SpinnerListener(View v) {
        sp = (Spinner) findViewById(v.getId());
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View v, int arg2,
            long arg3) {
        // Call to download class
        startDownload(arg2);


    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub

    }
}

private void startDownload(Integer... url) {
    DownloadFile downloadFile = new DownloadFile();
    downloadFile.execute();

}

class DownloadFile extends AsyncTask<String, Integer, String> { // put your
                                                                // download
                                                                // code

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mProgressDialog.show();
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
        mProgressDialog.setProgress(progress[0]);
    }

    @Override
    protected String doInBackground(String... aurl) {
        try {

            URL url = new URL(aurl[0]);
            URLConnection connection = url.openConnection();

            connection.connect();
            int fileLength = connection.getContentLength();
            int tickSize = 2 * fileLength / 100;
            int nextProgress = tickSize;

            Log.d(

            "ANDRO_ASYNC", "Lenght of file: " + fileLength);

            InputStream input = new BufferedInputStream(url.openStream());

            String path = Environment.getExternalStorageDirectory()
                    + "/Android/Data/"
                    + getApplicationContext().getPackageName() + "/files/" + name;
            File file = new File(path);
            file.mkdirs();
            File outputFile = file;

            OutputStream output = new FileOutputStream(outputFile);

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

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

        } catch (Exception e) {
        }
        return null;
    }

    protected void onProgressUpdate(String... progress) {
        Log.d("Downloading", progress[0]);

    }

    @Override
    protected void onPostExecute(String unused) {

        File file = new File(Environment.getExternalStorageDirectory()
                + "/Android/Data/"
                + getApplicationContext().getPackageName()
                + "/files/" + name);
        Intent testIntent = new Intent(Intent.ACTION_VIEW);
        testIntent.setType("application/pdf");
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        Uri uri = Uri.fromFile(file);
        intent.setDataAndType(uri, "application/pdf");
        try {
            startActivity(intent);
        } catch (ActivityNotFoundException e) {
            Toast.makeText(SpinnerActivity.this,
                    "No Application Available to View PDF",
                    Toast.LENGTH_LONG).show();
        }
    }
}
}

In your startDownload method, you are passing in url , which is an array of String type. startDownload方法中,您要传入url ,它是String类型的数组。 In doInBackground of your AsyncTask , you are only using the first index of url , which you have set as "" , so you're passing in an empty String . AsyncTask doInBackground中,您仅使用设置为""url的第一个索引,因此您要传递一个空的String

To pass in the URL you are expecting, change the startDownload method to accept an int value. 要传递您期望的URL,请更改startDownload方法以接受一个int值。 Then in the onItemSelected method, pass in the position, which you have named as arg2 (The parameter names should be parent, view, position, and id, in that order. Easier to understand what they mean). 然后,在onItemSelected方法中,传入您已命名为arg2 (参数名称应onItemSelected为parent,view,position和id,以便于理解。) Then when you call downloadFile.execute , pass in url[position] . 然后,当您调用downloadFile.execute ,传递url[position]

Edit 编辑

Change your download method to like this: 更改您的下载方法,如下所示:

private void startDownload(int position) {
    DownloadFile downloadFile = new DownloadFile();
    downloadFile.execute(url[position]);
}

That should give you the expected results, assuming the URLs you are using are valid. 假设您使用的URL有效,那应该可以给您预期的结果。 Also, your dialog isn't going away because you forgot to call mProgressDialog.dismiss() in onPostExecute . 而且,您的对话框不会消失,因为您忘记了在onPostExecute调用mProgressDialog.dismiss()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM