11

URLからビデオをダウンロードしようとしています。ダウンロードメソッドをasynctaskのdoInBackground()に実装しましたが、doInBackgroundメソッドが呼び出されるまでにかなりの時間がかかります(5〜10分)。別のasyntaskを使用しています。ビデオアクティビティをダウンロードするように指示されたアクティビティの画像をダウンロードし、正常に動作します。私のonPreExecuteメソッドは時間どおりに呼び出されていますが、その後、doInBackgroundの開始には約5〜7分かかります。私は提供されたどんな助けにも本当に感謝します。これがmycodeです

btnDownloadLQ.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) 
            {
                try
                {
                    new DownloadVideoTask().execute(videoURL);

                }
                catch(Exception e)
                {
                    Log.e("Vidit_TAG","I got an error",e);
                }
            }
        });

private class DownloadVideoTask extends AsyncTask<String, String, String> 
    {

        @SuppressWarnings("deprecation")
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            showDialog(DIALOG_DOWNLOAD_PROGRESS);
        }

        protected String doInBackground(String... urls) 
        {
            int i=0;
            try
            {
                URL url = new URL (urls[0]);
                InputStream input = url.openStream();

                try {
                    //The sdcard directory e.g. '/sdcard' can be used directly, or 
                    //more safely abstracted with getExternalStorageDirectory()
                    String root = Environment.getExternalStorageDirectory().toString();
                    File storagePath = new File(root + "/vidit");    
                    storagePath.mkdirs();
                    OutputStream output = new FileOutputStream (new File(storagePath,title+".mp4"));
                    try 
                    {
                        byte[] buffer = new byte[1024];
                        int bytesRead = 0;
                        while ((bytesRead = input.read(buffer, 0, buffer.length)) >= 0) 
                        {
                            output.write(buffer, 0, bytesRead);
                        }
                    }
                    catch(Exception e)
                    {   
                        Log.e("Vidit_TAG","I got an error",e);
                    }
                    finally 
                    {
                        output.close();
                    }
                }
                catch(Exception e)
                {
                    Log.e("Vidit_TAG","I got an error",e);
                }
                finally 
                {
                    input.close();
                    //tvTitle.setText("Completed");
                }

            }
            catch(Exception e)
            {
                Log.e("Vidit_TAG","I got an error",e);
            }

            return null;
        }


        @SuppressWarnings("deprecation")
        @Override
        protected void onPostExecute(String unused) 
        {
            dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
            alertbox(title);
        }
    }
4

3 に答える 3

16

必要に応じてキャンセルして、他の asyncTasks が実行されていないことを確認してください。

ほとんどの Android バージョンでは、asyncTask は単一のバックグラウンド スレッドで実行され、小さなタスクのみを実行する必要があります。

タスクに時間がかかりすぎる場合 (または複数のタスクがある場合) は、それらをキャンセルするか、別のアプローチを使用することを検討してください ( APIで説明されているように executeOnExecutor を使用するなど)。

于 2013-01-14T00:23:33.137 に答える
5

遅い回答ですが、確かに役立ちます

最小 API レベル >=11 を使用している場合は、これを試してください

 //new YourAsyncTask().execute(); -- replace this with following line
 new YourAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); //use this
于 2018-03-15T09:14:55.790 に答える
0

毎回発生するわけではありませんが、同じ問題に直面しています。

代わりに従来のスレッドを使用して、UI の変更を自分で処理できます。

于 2013-01-31T02:53:27.973 に答える