我的应用程序我将实现“进度”对话框,直到加载为止。 。 。 代码如下:
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();
}
}
答案 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();
}
}