如何从服务创建文件并从安卓活动中读取文件!(序列化/反序列化)



我正在开发一个用于查找重复文件的Android应用程序。 到目前为止,我已经开发了目录资源管理器活动。 用户将通过此活动选择目录,然后我在单独的进程中启动一个服务,以列出该目录中的所有文件(使用 DFS 算法)并查找其中的所有重复项。

现在,我想在单独的活动中显示该目录中所有文件及其子目录的列表。 我正在使用 ArrayList 来保存文件对象,并希望将此 ArrayList 从此服务传递到活动。 我正在将 ArrayList 写入服务中的文件"filelist.bin",并希望从活动中读取该文件,在这里我收到错误!.

同样为了启动活动,我正在使用通知,当它完成列出所有文件并将它们添加到 ArrayList 时,该服务会抛出该通知。

当我尝试读取文件时,我遇到"找不到资源"异常。所有错误详细信息都列在末尾。

以下是供您参考的代码(服务代码)

public class BgService extends Service {
static String DIR0;
//public static ArrayList<FileX> OnlyFiles = new ArrayList<FileX>();
public static Stack<File> dirStack = new Stack<File>();
public static File file0;
public static File[] filearray;
static int size=0;
static FileX file2;
public static ArrayList<File> sOnlyFiles = new ArrayList<File>();
ArrayList<File> ListoFile;
static String hash1,hash2;
static ArrayList<Integer> Index2Del= new ArrayList<Integer>();
ArrayList<FileX> localOF;
FileOutputStream fos ;
FileInputStream fis;
ObjectOutputStream obs;
ObjectInputStream obsi;
@Override
public void onCreate() {
// TODO Auto-generated method stub
//Toast.makeText(getApplicationContext(), "service created",5000).show();

super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
DIR0 = new String( intent.getCharArrayExtra("dir0"));
listAllfiles();
Collections.sort(sOnlyFiles, SizeFileComparator.SIZE_COMPARATOR);
serializeList();
//deserializeList();
/*
int size = ListoFile.size();
for(int i = 0;i<size;i++){
Toast.makeText(getApplicationContext(),String.valueOf(ListoFile.get(i).length()),1000).show();
}*/
displayNotification();
this.stopSelf();
return super.onStartCommand(intent, flags, startId);
}

@Override
public void onDestroy() {
// TODO Auto-generated method stub
//Toast.makeText(getApplicationContext(), "service destroyed",5000).show();
super.onDestroy();
}


public void listAllfiles(){
dirStack.push(new File(DIR0));
while(dirStack.size()!=0){
file0 = dirStack.pop();
filearray=file0.listFiles();
for(File lookFile : filearray){
if(lookFile.isFile() && lookFile.canRead()){
sOnlyFiles.add(lookFile);
DataHolder.Dcounter++;
}
else if(lookFile.isDirectory()&& lookFile.canRead()){
dirStack.push(lookFile);
}
}
}
}
public void serializeList()  {
String filename = "filelist.bin";
File dir = getDir("DFR", MODE_PRIVATE);
try {
Resources res = Resources.getSystem();
fos = openFileOutput(filename, MODE_PRIVATE);
obs = new ObjectOutputStream(fos);
obs.writeObject(sOnlyFiles);
obs.flush();
obs.close();
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void displayNotification(){
NotificationManager nm = (NotificationManager)getSystemService(getApplicationContext().NOTIFICATION_SERVICE);
Intent i = new Intent(getApplicationContext(),AllFiles.class);
//  Bundle listfile = new Bundle();
//listfile.putStringArrayList("listfile", sOnlyFiles);
//i.putExtra(name, value)
//i.putExtra("filelist", sOnlyFiles);
PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
Notification nf = new Notification(R.drawable.ic_launcher,"Duplicate File Removern"+ DataHolder.Dcounter+"  files found",System.currentTimeMillis());
nf.setLatestEventInfo(getApplicationContext(), "Duplicate File Remover",  DataHolder.Dcounter+" files found",pi);
nf.vibrate = new long[]{100,250,100,500};
nm.notify(1,nf);

}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}

(活动守则)

public class AllFiles extends ListActivity{
FileInputStream fis ;
ObjectInputStream obs;
public static ArrayList<File> ListoFiles;
@Override
protected void onCreate(Bundle savedInstanceState) {
stopService(new Intent(this, BgService.class));
deserializeList();

//  stopService(new Intent(this, BgService.class));
//setListAdapter(new OnlyFilesAdapter());
//Bundle filelist = getIntent().getExtras();
super.onCreate(savedInstanceState);

}
public void deserializeList(){
Object tolist =null;
String filename = "filelist.bin";
try {
fis = openFileInput(filename);
if(fis!=null){
obs = new ObjectInputStream(fis);
tolist = obs.readObject();
@SuppressWarnings("unchecked")
ArrayList<File> tolist2 = (ArrayList<File>)tolist;
ListoFiles = tolist2;
obs.close();
fis.close();
Toast.makeText(getApplicationContext(), ListoFiles.size(), 5000).show();
}else
Toast.makeText(getApplicationContext(), "file not available", 2000).show();

} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

错误时的日志猫值:-

10-14 13:30:33.018:W/ResourceType(433):获取资源编号 0x0000001b 的值时没有包标识符 10-14 13:30:33.070: D/Android运行时(433): 关闭虚拟机 10-14 13:30:33.070:W/dalvikvm(433):threadid=1:线程退出,出现未捕获的异常(组=0x40015560) 10-14 13:30:33.269: E/Android运行时(433): 致命异常: 主要 10-14 13:30:33.269: E/AndroidRuntime(433): java.lang.RuntimeException: 无法启动活动 ComponentInfo{my.com.filebrowser/my.com.filebrowser.AllFiles}: android.content.res.Resources$NotFoundException: 字符串资源 ID #0x1b 10-14 13:30:33.269: E/AndroidRuntime(433): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 10-14 13:30:33.269: E/AndroidRuntime(433): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 10-14 13:30:33.269: E/AndroidRuntime(433): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 10-14 13:30:33.269: E/AndroidRuntime(433): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 10-14 13:30:33.269: E/AndroidRuntime(433): at android.os.Handler.dispatchMessage(Handler.java:99) 10-14 13:30:33.269: E/AndroidRuntime(433): at android.os.Looper.loop(Looper.java:123) 10-14 13:30:33.269: E/AndroidRuntime(433): at android.app.ActivityThread.main(ActivityThread.java:3683) 10-14 13:30:33.269: E/AndroidRuntime(433): at java.lang.reflect.Method.invokeNative(Native Method) 10-14 13:30:33.269: E/AndroidRuntime(433): at java.lang.reflect.Method.invoke(Method.java:507) 10-14 13:30:33.269: E/AndroidRuntime(433): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 10-14 13:30:33.269: E/AndroidRuntime(433): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 10-14 13:30:33.269: E/AndroidRuntime(433): at dalvik.system.NativeStart.main(Native Method) 10-14 13:30:33.269:E/AndroidRuntime(433):由:android.content.res.Resources$NotFoundException:字符串资源ID #0x1b 10-14 13:30:33.269: E/AndroidRuntime(433): at android.content.res.Resources.getText(Resources.java:201) 10-14 13:30:33.269: E/AndroidRuntime(433): at android.widget.Toast.makeText(Toast.java:258) 10-14 13:30:33.269: E/AndroidRuntime(433): at my.com.filebrowser.AllFiles.deserializeList(AllFiles.java:60) 10-14 13:30:33.269: E/AndroidRuntime(433): at my.com.filebrowser.AllFiles.onCreate(AllFiles.java:34) 10-14 13:30:33.269: E/AndroidRuntime(433): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 10-14 13:30:33.269: E/AndroidRuntime(433): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 10-14 13:30:33.269: E/Android运行时(433): ...11 更多

在以下代码行中:

Toast.makeText(getApplicationContext(), ListoFiles.size(), 5000).show();

ListoFiles.size()int年回归。如果您致电

Toast.makeText(Context context, int resId, int duration)

然后,API 期望第二个参数是字符串资源的 ID。在您的情况下,事实并非如此。如果您只想显示带有数字的吐司,请尝试以下操作:

Toast.makeText(getApplicationContext(), "" + ListoFiles.size(), 5000).show();

Toast.makeText(getApplicationContext(), Integer.toString(ListoFiles.size()), 5000).show();

最新更新