无法让 doInBackground 在 AsyncTask 中工作
Posted
技术标签:
【中文标题】无法让 doInBackground 在 AsyncTask 中工作【英文标题】:Can't get doInBackground to work in AsyncTask 【发布时间】:2020-08-15 02:15:23 【问题描述】:我是 AsyncTask 的新手,所以如果我的问题很愚蠢,请提前道歉。长话短说,我有一个处理一些文件的方法,我想在后台运行它。我的课程在下面,问题是直接调用该方法时可以正常工作,但是当我尝试通过 doInBackground 调用它时绝对没有任何反应。
这有效:
AttachFilesFromFolder.attach(files);
这不会:
new AttachFilesFromFolder().execute(files);
有问题的班级:
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();
【问题讨论】:
我看不出这不应该工作的任何原因,除非您的 AsyncTask 执行程序被阻止(由于此类问题,可能避免 AsyncTask 用于新代码)。您的 doInBackground 方法是否正在运行?向其中添加日志。 此外,您当前对Thread
s 的使用完全没有意义。你是按顺序启动它们,然后立即加入它们,所以你没有得到任何好处,只是做了额外的工作。
谢谢。我之前添加了一个日志,它证明 doInBackground 根本没有运行。至于我对线程的使用,目标是确保线程 1 在线程 2 启动之前完成。
对,但既然你马上就要加入他们,为什么不直接在doInBackground
中完成所有这些工作呢?为什么要为线程烦恼?
您确定会在 doInBackground 中一个接一个地运行吗?无论如何,看起来 onPreExecute 事件在我的班级中被正确触发,但 doInBackground 不是。我收到“尝试完成输入事件,但输入事件接收器已被释放”错误。
【参考方案1】:
通过使用 executeOnExecutor 解决。那行得通。
【讨论】:
以上是关于无法让 doInBackground 在 AsyncTask 中工作的主要内容,如果未能解决你的问题,请参考以下文章
TypeError:无法提取-Javascript Asyn问题
即使使用取消方法也无法取消 AsyncTask 中的 doInBackground 进程
s3fs 和 fsspec 版本的工作组合是啥? ImportError:无法从“fsspec.asyn”导入名称“maybe_sync”