2012-05-05 46 views
0

激活微调器中的任何按钮后,进度对话框出现,但没有任何反应。我已经完美地使用了按钮,但在转换到spinners时不明白这里有什么问题。任何人发现下载无法正确启动的原因?Android - 微调器异步下载无法正常工作

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(); 
     } 
    } 
} 
} 

回答

1

在你startDownload方法,要传递在url,这是String类型的阵列。在您的AsyncTaskdoInBackground中,您只使用url的第一个索引,该索引设置为"",因此您传递的是空的String

要传递您期望的URL,请将startDownload方法更改为接受int值。然后在onItemSelected方法中,传入您已命名为arg2的位置(参数名称应该是父级,视图,位置和id,按照该顺序更容易理解它们的含义)。然后当你拨打downloadFile.execute时,通过url[position]

编辑

更改下载方法是这样的:

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

这应该给您预期的结果,假设你正在使用的URL是否有效。此外,您的对话不会消失,因为您忘记了在onPostExecute中拨打mProgressDialog.dismiss()

+0

更改为ItemClick而不是ItemSelected后,我得到强制关闭,更新代码和崩溃logcat。 – user1363871

+0

啊,这个方法不被'Spinner'支持。对不起,我给你一个不好的答案。你可以把它改回'onItemSelected'并在监听器内打印出一个'Log'吗?让我知道该日志是否打印到LogCat。 –

+0

更改回原来的帖子。没有什么会打印到LogCat中,但会发生什么情况是当应用程序启动时,进度对话框立即打开,并且我得到Toast消息,没有PDF视图可用。 – user1363871