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