作業用ディレクトリの管理クラス。
static class MyTempDir {
private Context mContext = null;
private ArrayList< File> mTempDir = null; // 作業ディレクトリ
private ArrayList< Boolean> usingFlag = null; // 作業中 true
private ArrayList< Boolean> usedFlag = null; // 使用後 true
private ArrayList< Boolean> clearFlag = null;// 消去中 true
MyTempDir( Context context ) {
mContext = context;
mTempDir = new ArrayList< File>();
usingFlag = new ArrayList< Boolean>();
usedFlag = new ArrayList< Boolean>();
clearFlag = new ArrayList< Boolean>();
init();
}
private void init() {
File dir = new File( mContext.getFilesDir(), "temp" );
dir = new File( dir, "temp1" );
boolean b;
if ( !dir.exists() ) b = dir.mkdirs();
mTempDir.add(dir);
usingFlag.add(false);
usedFlag.add(false);
clearFlag.add(false);
}
private boolean mGetDirFlag = false;
private File getTempDir() {
mGetDirFlag = true;
int usingNo = getUsingTempDir();
int i = mTempDir.size();
while ( --i >= 0 ) {
if ( !usingFlag.get( i ) && !usedFlag.get( i ) && !clearFlag.get( i ) ) break;
}
if ( usingNo >= 0 ) {
usingFlag.set( usingNo, false );
usedFlag.set( usingNo, true );
}
if ( i < 0 ) {
File dir = new File( mContext.getFilesDir(), "temp" );
i = mTempDir.size();
String dirName = "temp" + String.valueOf( (i+1) );
dir = new File( dir, dirName );
boolean b;
if ( !dir.exists() ) b = dir.mkdirs();
mTempDir.add(dir); // 4つはセットで追加する
usingFlag.add(true); // 管理できなければ、4つを1つの構造体にして配列使用
usedFlag.add(false); //
clearFlag.add(false);//
mGetDirFlag = false;
allClearTempFile();
return mTempDir.get(i);
}
usingFlag.set( i, true );
mGetDirFlag = false;
allClearTempFile();
return mTempDir.get(i);
}
public void setUsingFlag( int no, boolean flag ) { usingFlag.set( no, flag ); }
public void setUsedFlag( int no, boolean flag ) { usedFlag.set( no, flag ); }
public void setClearFlag( int no, boolean flag ) { clearFlag.set( no, flag ); }
public int getUsingTempDir() {
int i = mTempDir.size();
while ( --i >= 0 ) {
if ( usingFlag.get(i) ) break;
}
return i;
}
private boolean isUsingTempDir( int no ) {
return ( no >= 0 && no < mTempDir.size() )? usingFlag.get(no): false;
}
private boolean isUsedTempDir( int no ) {
return ( no >= 0 && no < mTempDir.size() )? usedFlag.get(no): false;
}
private boolean isClearTempDir( int no ) {
return ( no >= 0 && no < mTempDir.size() )? clearFlag.get(no): false;
}
public void allClearTempFile() {
int i = mTempDir.size();
while ( --i >= 0 ) {
if ( usedFlag.get(i) ) {
clearFlag.set( i, true );
allClearTempFile( mTempDir.get(i) );
clearFlag.set( i, false );
usedFlag.set( i, false );
}
}
}
private void allClearTempFile( File dir ) {
new Thread(new Runnable() {
@Override
public void run() {
while ( true ) {
if (!mGetDirFlag) break;
}
boolean b;
File[] files = dir.listFiles();
for ( File file: files) {
b= file.delete();
}
}
}).start();
}
public File getTempDirForAdapter() {
int no = getUsingTempDir();
return ( no < 0 )? null: mTempDir.get( no ); // 使用中の作業ディレクトリを返す
}
public void finish() {
mTempDir.clear();
mTempDir = null;
usingFlag.clear();
usingFlag = null;
clearFlag.clear();
clearFlag = null;
mContext = null;
}
}
MyTempDir mTempDir = new MyTempDir( mContext );