Java Can';在异步任务中,您无法获得doInBackground来工作

Java Can';在异步任务中,您无法获得doInBackground来工作,java,android,android-asynctask,Java,Android,Android Asynctask,我不熟悉异步任务,所以如果我的问题很愚蠢,请提前道歉。长话短说,我有一个处理一些文件的方法,我想在后台运行它。我的类在下面,问题是直接调用该方法时效果很好,但当我试图通过doInBackground调用它时,绝对不会发生任何事情 这项工作: AttachFilesFromFolder.attach(文件) 但这并不是: newattachfilesfromfolder().execute(文件) 有关班级: public class AttachFilesFromFolder extends A

我不熟悉异步任务,所以如果我的问题很愚蠢,请提前道歉。长话短说,我有一个处理一些文件的方法,我想在后台运行它。我的类在下面,问题是直接调用该方法时效果很好,但当我试图通过doInBackground调用它时,绝对不会发生任何事情

这项工作:
AttachFilesFromFolder.attach(文件)

但这并不是:
newattachfilesfromfolder().execute(文件)

有关班级:

public class AttachFilesFromFolder extends AsyncTask<File[], Void, Void> {
    @Override
    protected Void doInBackground(File[]... files) {
        try {
            attach(files[0]);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void attach(File[] files) throws InterruptedException {
        for (File file : files) {
            log("For loop started.");
            File targetLocation = new File(Environment.getDataDirectory() + "/data/org.p4.epo.android/" + file.getName());

            Thread t1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        InputStream in = new FileInputStream(file);
                        OutputStream out = new FileOutputStream(targetLocation);

                        byte[] buf = new byte[1024];
                        int len;

                        while ((len = in.read(buf)) > 0) {
                            out.write(buf, 0, len);
                        }

                        buf = null;
                        in.close();
                        in = null;
                        out.close();
                        out = null;
                        log("Copied file " + targetLocation.toString() + " successfully.");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });

            Thread t2 = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        SdkManager.sharedInstance().addAttachment(targetLocation.toString(), file.getName(), AttachMode.asNewPage, 1, false);
                        log("Attached " + file.getName());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });

            log("Thread T1 started.");
            t1.start();
            t1.join();
            log("Thread T2 started.");
            t2.start();
            t2.join();
        }
    }
}
public类AttachFilesFromFolder扩展异步任务{
@凌驾
受保护的Void doInBackground(文件[]…文件){
试一试{
附加(文件[0]);
}捕捉(中断异常e){
e、 printStackTrace();
}
返回null;
}
公共静态void attach(文件[]文件)引发InterruptedException{
用于(文件:文件){
日志(“For循环已启动”);
File targetLocation=新文件(Environment.getDataDirectory()+”/data/org.p4.epo.android/“+File.getName());
线程t1=新线程(新的可运行线程(){
@凌驾
公开募捐{
试一试{
InputStream in=新文件InputStream(文件);
OutputStream out=新文件OutputStream(targetLocation);
字节[]buf=新字节[1024];
内伦;
而((len=in.read(buf))>0){
out.write(buf,0,len);
}
buf=null;
in.close();
in=null;
out.close();
out=null;
日志(“复制文件”+targetLocation.toString()+“成功”);
}捕获(例外e){
e、 printStackTrace();
}
}
});
线程t2=新线程(新可运行(){
@凌驾
公开募捐{
试一试{
SdkManager.sharedInstance().addAttachment(targetLocation.toString(),file.getName(),AttachMode.asNewPage,1,false);
日志(“附加”+文件.getName());
}捕获(例外e){
e、 printStackTrace();
}
}
});
日志(“线程T1已启动”);
t1.start();
t1.join();
日志(“线程T2已启动”);
t2.start();
t2.连接();
}
}
}

使用executeOnExecutor解决。成功了。

使用executeOnExecutor解决了这个问题。这是有效的。

我看不出有任何理由认为这不起作用,除非您的AsyncTask执行器被阻止(可能会因为这样的问题而避免AsyncTask用于新代码)。您的doInBackground方法是否正在运行?另外,您当前使用的
Thread
s完全没有意义。您连续启动它们,然后立即加入它们,因此您不会得到任何好处,只是做额外的工作。谢谢。我之前添加了一个日志,它证明了doInBackground根本没有运行。至于我对线程的使用,目标是确保线程1在线程2启动之前完成。对,但是既然你马上就要加入它们,为什么不在
doInBackground
中完成所有这些工作呢?为什么还要麻烦线程呢?你确定线程会在doInBackground中一个接一个地运行吗?在任何情况下,看起来onPreExecute事件在我的类中都被正确触发,但doInBackground没有。我得到了“试图完成一个输入事件,但输入事件接收器已经被释放”错误。我看不出这不起作用的任何原因,除非您的AsyncTask执行器被阻止(由于类似问题,可能会避免AsyncTask用于新代码)。您的doInBackground方法是否正在运行?另外,您当前使用的
Thread
s完全没有意义。您连续启动它们,然后立即加入它们,因此您不会得到任何好处,只是做额外的工作。谢谢。我之前添加了一个日志,它证明了doInBackground根本没有运行。至于我对线程的使用,目标是确保线程1在线程2启动之前完成。对,但是既然你马上就要加入它们,为什么不在
doInBackground
中完成所有这些工作呢?为什么还要麻烦线程呢?你确定线程会在doInBackground中一个接一个地运行吗?在任何情况下,看起来onPreExecute事件在我的类中都被正确触发,但doInBackground没有。我得到了“试图完成一个输入事件,但输入事件接收器已经被释放”错误。