0

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

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

此外,为了启动活动,我正在使用服务在完整列出所有文件并将它们添加到 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 Remover\n"+ 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();
}

}

错误时的 LogCat 值:-

10-14 13:30:33.018:W/ResourceType(433):获取资源编号 0x0000001b 的值时没有包标识符
10-14 13:30:33.070: D/AndroidRuntime(433): 关闭虚拟机
10-14 13:30:33.070: W/dalvikvm(433): threadid=1: 线程以未捕获的异常退出 (group=0x40015560)
10-14 13:30:33.269:E/AndroidRuntime(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): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
10-14 13:30:33.269: E/AndroidRuntime(433): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
10-14 13:30:33.269: E/AndroidRuntime(433): 在 android.app.ActivityThread.access$1500(ActivityThread.java:117)
10-14 13:30:33.269: E/AndroidRuntime(433): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
10-14 13:30:33.269: E/AndroidRuntime(433): 在 android.os.Handler.dispatchMessage(Handler.java:99)
10-14 13:30:33.269: E/AndroidRuntime(433): 在 android.os.Looper.loop(Looper.java:123)
10-14 13:30:33.269: E/AndroidRuntime(433): 在 android.app.ActivityThread.main(ActivityThread.java:3683)
10-14 13:30:33.269: E/AndroidRuntime(433): 在 java.lang.reflect.Method.invokeNative(Native Method)
10-14 13:30:33.269: E/AndroidRuntime(433): 在 java.lang.reflect.Method.invoke(Method.java:507)
10-14 13:30:33.269: E/AndroidRuntime(433): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-14 13:30:33.269: E/AndroidRuntime(433): 在 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): 在 android.content.res.Resources.getText(Resources.java:201)
10-14 13:30:33.269: E/AndroidRuntime(433): 在 android.widget.Toast.makeText(Toast.java:258)
10-14 13:30:33.269: E/AndroidRuntime(433): 在 my.com.filebrowser.AllFiles.deserializeList(AllFiles.java:60)
10-14 13:30:33.269: E/AndroidRuntime(433): 在 my.com.filebrowser.AllFiles.onCreate(AllFiles.java:34)
10-14 13:30:33.269: E/AndroidRuntime(433): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-14 13:30:33.269: E/AndroidRuntime(433): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
10-14 13:30:33.269: E/AndroidRuntime(433): ... 11 更多
4

1 回答 1

1

在这行代码中:

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();
于 2012-10-16T13:53:45.933 回答