Как реализовать диалог Progress для этого кода? - PullRequest
2 голосов
/ 21 ноября 2011

В моем приложении я собираюсь реализовать диалоговое окно Progress до его загрузки. , , Код похож на:

copyFileFromAssetsToSDCard("Alone.mp4");
intent = new Intent(this,VideoPlayerController.class);
startActivity(intent);

Так как это реализовать ?? Спасибо.

Код для функции:

public void copyFileFromAssetsToSDCard(String fileFromAssets){
    AssetManager is = this.getAssets();
    InputStream fis;
    try {

        fis = is.open(fileFromAssets);
        FileOutputStream fos;

        fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory(), fileFromAssets));
        byte[] b = new byte[8];
        int i;
        while ((i = fis.read(b)) != -1) {
            fos.write(b, 0, i);
        }
        fos.flush();
        fos.close();
        fis.close();
    } catch (IOException e1) {
        e1.printStackTrace();
    }
}

Ответы [ 5 ]

3 голосов
/ 21 ноября 2011
public class MainActivity extends Activity {  
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        new progressTask().execute("");
     }

     public void copyFileFromAssetsToSDCard(String fileFromAssets){
         AssetManager is = this.getAssets();
         InputStream fis;
         try {
            fis = is.open(fileFromAssets);
            FileOutputStream fos;

            fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory(), fileFromAssets));
            byte[] b = new byte[8];
            int i;
            while ((i = fis.read(b)) != -1) {
                fos.write(b, 0, i);
            }
            fos.flush();
            fos.close();
            fis.close();
        } catch (IOException e1) {
             e1.printStackTrace();
        }
    }


    private class progressTask extends AsyncTask<String, Void, Void> {
       ProgressDialog pd = new ProgressDialog(MainActivity.this);

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

       protected Long doInBackground(String... params) {
            copyFileFromAssetsToSDCard("Alone.mp4");
       }

       protected void onPostExecute(Void result) {
            pd.dismiss();
       }

   }

}

Я договорился обо всех ваших задачах вместе.Попытайся.Надеюсь, это поможет вам.

1 голос
/ 21 ноября 2011

Вы можете сделать это,

Создайте ArrayList<String> files = new ArrayList<String>(); и добавьте все файлы, которые вы можете скопировать на SDCard, как показано ниже.

        files.add("test.png");
        files.add("icon.png");
        new myAsyncTask().execute(files);

Тогда вы можете просто использовать этот объект ArrayList, чтобы перейти к AsynTask и выполнить его.

private class myAsyncTask extends AsyncTask<ArrayList<String>, Void, Void>
    {
        ArrayList<String> files;
        ProgressDialog dialog;
        @Override
        protected void onPreExecute() {
            dialog = ProgressDialog.show(mainact.this, "Loading...", "");
        }
        @Override
        protected Void doInBackground(ArrayList<String>... params) {

            files = params[0];
            for (int i = 0; i < files.size(); i++) {
                copyFileFromAssetsToSDCard(files.get(i));   
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void result) {
            dialog.dismiss();
        }

    }
1 голос
/ 21 ноября 2011

попробуйте этот код для отображения диалогового окна хода выполнения,

</p>

<code>ProgressDialog progDailog = ProgressDialog.show(this,"Process ", "please wait....",false,true);

new Thread ( new Runnable()
{
        public void run()
        {
              // Put Intent your code here
        }
}
</code>
1 голос
/ 21 ноября 2011

Я думаю, что вы хотите реализовать операцию копирования в фоновом потоке (во время которой вы хотите отобразить индикатор выполнения или диалоговое окно), и как только операция копирования будет завершена, вы захотите начать другое действие, если это так, то я бы предложил вамя думаю, что AsyncTask и это лучший метод для реализации процесса многопоточности в Android, потому что мы, разработчик, не должны заботиться об управлении потоками, если мы реализовали этот AsyncTask.

Для вашего случая:

private class myBackgroundTask extends AsyncTask<Void, Void, Void> 
 {
     @Override  
     protected void onPreExecute() 
     {  
        // Show Progress bar or dialog
     } 

     protected Long doInBackground(Void... void) {
         // write your Copy from Assets to SDcard code here
     }

     protected void onPostExecute(Long result) 
     {
        if(dialog.isShowing())    // if progress dialog is showing
        {
            dialog.dismiss();
        }
        // And now Write Start Activity code here
     }
 }

Обновление:

К вашему сведению, просто быстрое обновление AsyncTask известно как Painless Threading in Android, пройдите через этостатьи, и я уверен, что вы обязательно узнаете о важности этой концепции по сравнению с общей реализацией потоков.

1 голос
/ 21 ноября 2011

попробуйте переместить код копирования в поток и показать диалоговое окно, а после завершения потока удалите диалоговое окно и запустите новое действие.

Примерно так:

showDialog(10);//10 is the dialog id
new Thread(new Runnable(){
   public void run(){
      copyFileFromAssetsToSDCard("Alone.mp4"); 
      handler.sendEmptyMessage(1);
   }
}).start();

Сделать обработчик для получения сообщения:

Handler handler=new Handler(){
   void handleMessage(Message msg){
    switch(msg.what){
     case 1:
       removeDialog(10);
       intent = new Intent(this,VideoPlayerController.class);
       startActivity(intent); 
       break;
    }
    };
};
...