我希望我的应用程序仅在第一次打开时才将文件复制到SD卡中,而不是每次打开应用程序时都是如此。
有人可以帮助完成代码,这样只有资产才能复制吗?
我的代码复制资产的部分是: 私有类Asyntasking扩展了AsyncTask
这是我的代码:
public class SplashScreen extends Activity {
private ProgressBar progressBar;
private int progressStatus = 0;
private TextView textView;
private Handler handler = new Handler();
public static final String TAG = "SplashScreen";
String now_playing, earned;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
new Asyntasking().execute();
progressBar = (ProgressBar) findViewById(R.id.progressBar1);
textView = (TextView) findViewById(R.id.textView1);
// Start long running operation in a background thread
new Thread(new Runnable() {
public void run() {
while (progressStatus < 100) {
progressStatus += 1;
handler.post(new Runnable() {
public void run() {
progressBar.setProgress(progressStatus);
textView.setText(progressStatus+"/"+progressBar.getMax());
}
});
try {
Thread.sleep(350);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
private class Asyntasking extends AsyncTask<Void,Void,Void>
{
private void copyAssets(String path)
{
String[] files = null;
try
{
files = getAssets().list(path);
} catch (IOException e)
{
e.printStackTrace();
}
if (files.length == 0)
copyFile(path);
else
{
File dir = new File(getExternalFilesDir(null), path);
if (!dir.exists())
dir.mkdir();
for (int i = 0; i < files.length; i++)
{
copyAssets(path + "/" + files[i]);
}
}
}
private void copyFile(String filename)
{
InputStream in = null;
File file;
OutputStream out = null;
try
{
in = getAssets().open(filename);
} catch (IOException e)
{
Log.e(TAG, "ERROR WITH in = getAssets().open: " + filename);
e.printStackTrace();
}
file = new File(getExternalFilesDir(null), filename);
try
{
out = new FileOutputStream(file);
} catch (FileNotFoundException e)
{
Log.e(TAG, "ERROR WITH out = new FileOutputStream(file);");
e.printStackTrace();
}
byte[] data;
try
{
data = new byte[in.available()];
in.read(data);
out.write(data);
in.close();
out.close();
} catch (IOException e1)
{
e1.printStackTrace();
}}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
copyAssets("ErgonomicsHelp");
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Intent i = new Intent(SplashScreen.this, MainActivity.class);
i.putExtra("now_playing", now_playing);
i.putExtra("earned", earned);
startActivity(i);
// close this activity
finish();
}}
}
它工作正常,我只想让它发生一次,但不知道如何改变它。 谢谢, 德里克
答案 0 :(得分:0)
我假设您希望AsyncTask运行一次。你必须在某个地方保存状态,但最简单的是在SharedPreference中。你可以这样做:
private static final String ASYNC_TASK_HAS_RUN = "asynctask_has_run";
SharedPreferences prefs = getSharedPreferences(FILE_NAME, MODE_PRIVATE);
if(prefs.getBoolean(ASYNC_TASK_HAS_RUN, false)){
new Asyntasking().execute();
prefs.setBoolean(ASYNC_TASK_HAS_RUN, true);
}
此外,我注意到您正在创建一个线程来将结果发布到进度。 AsyncTasks已经有一个在主线程上运行的onProgress方法,所以你可以利用它。
答案 1 :(得分:0)
一种简单的方法是检查文件系统上是否已存在该文件(使用File.exists),如果存在则不复制。更方便的方法是检查文件的时间戳,因此如果您更新应用程序,则可以复制更新的数据文件。