2011-03-12 10 views
1
private class DownloadLargeFileTask extends AsyncTask<Void, Void, Void> 
{ 
    private final ProgressDialog dialog; 

    public DownloadLargeFileTask(ProgressDialog dialog) { 
     this.dialog = dialog; 
    } 

    protected void onPreExecute() { 
     dialog.show(); 
    } 


    protected void onPostExecute(Void unused) { 
     dialog.dismiss(); 
    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 
     download(); 
     return null; 
    } 
} 

private void download() 
{ 
    try 
    { 
     long startTime = System.currentTimeMillis(); 

     URL u = new URL("http://mds.podfm.ru/188/download/040_Sergejj_Palijj_-_Karantin_CHast_2.mp3"); 
     HttpURLConnection c = (HttpURLConnection) u.openConnection(); 

     c.setRequestMethod("GET"); 
     c.setDoOutput(true); 
     c.connect(); 
     FileOutputStream f = new FileOutputStream(new File("/sdcard/","my.mp3")); 

     InputStream in = c.getInputStream(); 

     byte[] buffer = new byte[1024]; 
     int len1 = 0; 
     int downloadedSize = 0; 
     while ((len1 = in.read(buffer)) != -1) 
     { 
      f.write(buffer,0, len1); 
      downloadedSize += len1; 
      ReturnDownloadedBytes(downloadedSize); 
     } 
     f.close(); 
     Log.d("ImageManager", "download ready in" + ((System.currentTimeMillis() - startTime)/1000) + " sec"); 
    } 
    catch (IOException e) 
    { 
     Log.d("ImageManager", "Error" + ((System.currentTimeMillis())/1000) + e + " sec"); 
    } 
} 

private void ReturnDownloadedBytes(int size) 
{ 
    text.setText(String.valueOf(size)); 

} 

エラー:ビュー階層を作成した元のスレッドだけがそのビューにアクセスできます。 これは、私が1つのtheradからtextviewを作成し、別の1つ(AsyncTask)からアクセスしようとしているが、それを取得する方法を意味すると思いますか? ここに感謝ファイルサイズのダウンロード中にエラーが発生する

EDIT
は、すべてのコードです。私はpublishProgress(downloadedSize) int value = 10に送っても、それはalwysあなたはUIスレッドに進捗状況を公開することによってUIを変更することができます[Ljava.lang.float;@43ed62f78

public class list extends Activity { 

private TextView text; 



@Override 
public void onCreate(Bundle icicle) 
{ 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 

    text = (TextView)findViewById(R.id.result); 
} 

public void selfDestruct(View view) { 

    ProgressDialog dialog = new ProgressDialog(this); 
    dialog.setMessage("????????. ?????..."); 
    new DownloadLargeFileTask(dialog).execute(); 

} 


private class DownloadLargeFileTask extends AsyncTask<Void, Integer, Void> 
{ 
    private final ProgressDialog dialog; 

    public DownloadLargeFileTask(ProgressDialog dialog) { 
     this.dialog = dialog; 
    } 

    protected void onPreExecute() { 
     dialog.show(); 
    } 


    protected void onPostExecute(Void unused) { 
     dialog.dismiss(); 
    } 

    protected void onProgressUpdate(Integer...progress) { 

     text.setText(String.valueOf(progress)); 

    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 
     try 
     { 
      long startTime = System.currentTimeMillis(); 

      URL u = new URL("http://mds.podfm.ru/188/download/040_Sergejj_Palijj_-_Karantin_CHast_2.mp3"); 
      HttpURLConnection c = (HttpURLConnection) u.openConnection(); 

      c.setRequestMethod("GET"); 
      c.setDoOutput(true); 
      c.connect(); 
      FileOutputStream f = new FileOutputStream(new File("/sdcard/","my.mp3")); 

      InputStream in = c.getInputStream(); 

      byte[] buffer = new byte[1024]; 
      int len1 = 0; 
      int downloadedSize = 10; 
      while ((len1 = in.read(buffer)) != -1) 
      { 
       f.write(buffer,0, len1); 
       //downloadedSize += len1; 
       **publishProgress(downloadedSize);** 
      } 
      f.close(); 
      Log.d("ImageManager", "download ready in" + ((System.currentTimeMillis() - startTime)/1000) + " sec"); 
     } 
     catch (IOException e) 
     { 
      Log.d("ImageManager", "Error" + ((System.currentTimeMillis())/1000) + e + " sec"); 
     } 
     return null; 
    } 
} 

答えて

2

エラーの評価に間違いはありません。私はtextActivityで定義されているTextViewオブジェクトであると仮定しています。そのため、UIスレッドで作成されます。 doInBackground()で実行されるコードは、別のスレッドで実行されます。 UIスレッドのみがUI要素の更新を実行できるため、setTextを呼び出そうとすると、報告したエラーメッセージが表示されます。 publishProgressonProgressUpdate()を呼び出します:AsyncTaskあなたはUIスレッドにバックグラウンドスレッドから更新を送信するために呼び出すことができるメソッドを持っているよう

Abhinavは、問題を解決する方法でも正しいです。

あなたAsyncTaskにこのメソッドを追加: "URL、整数、ロングは" この「プライベートでは意味ないものを私に説明することができ

while ((len1 = in.read(buffer)) != -1) 
{ 
    f.write(buffer,0, len1); 
    downloadedSize += len1; 
    publishProgress(downloadedSize); 
} 
+0

@Override protected void onProgressUpdate(Integer... integer){ text.setText(integer[0].toString()); } 

をそしてdownload()whileループを変更クラスDownloadFilesTaskはAsyncTask を拡張し、このparams /の順番に何が違うかを示します。ありがとう – SERG

+0

と私はtext.setText(String.valueOf(progress))を呼び出します。結果として私はTextViewに[Ljava.lang.float; @ 43ed62f78のようなものがあります。これはどういう意味ですか? – SERG

+0

@SERG [documentation](http://developer.android.com/reference/android/os/AsyncTask.html)をチェックすると、それらはParams、Progress、およびResultです。私は他の問題を診断するためにあなたのコードをもっと見る必要があります。 –

関連する問題