2012-05-05 47 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