如何实现此代码的“进度”对话框?

时间:2011-11-21 04:43:00

标签: android android-layout android-emulator android-widget progressdialog

我的应用程序我将实现“进度”对话框,直到加载为止。 。 。 代码如下:

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 个答案:

答案 0 :(得分:3)

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 :(得分:1)

尝试将复制代码移动到一个线程并显示对话框,在线程结束后,删除对话框启动新活动。

这样的事情:

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

答案 2 :(得分:1)

尝试使用此代码显示进度对话框,

ProgressDialog progDailog = ProgressDialog.show(this,"Process ", "please wait....",false,true); new Thread ( new Runnable() { public void run() { // Put Intent your code here } }

答案 3 :(得分:1)

我认为你想在后台线程中实现复制操作(在此期间你要显示进度条或对话框),一旦复制操作完成,那么你想要开始另一个活动,如果是这种情况那么我会建议你实现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,请仔细阅读本文,我相信您一定会了解这一概念与一般线程实现相比的重要性。

答案 4 :(得分:1)

你可以这样做,

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

    }