- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 dataGetter 类,在其中加载必要的数据(部分 url 地址、电子邮件等),然后调用 AsyncTask。我使用一个抽屉菜单,其中每个 fragment 在创建时都会从新线程调用 dataGetter。如果我在 fragment 之间快速切换(在 AsyncTask 完成之前),数据将混合(在新 fragment 中我将释放前一个 fragment 中的数据)。我尝试过使用 AsyncTask.cancel,但总是收到错误。
public class dataGetter {
@SuppressLint("StaticFieldLeak")
public static Context context;
private static String siteURL;
private static String domain;
private static boolean login;
private static String email;
private static String password;
private static AsyncRetrieve asyncRetrieve;
public static String getData(Context context, String url, String domain, boolean login, String email, String password) {
dataGetter.context = context;
dataGetter.siteURL = url;
dataGetter.domain = domain;
dataGetter.login = login;
dataGetter.email = email;
dataGetter.password = password;
String result = "";
try {
if (asyncRetrieve != null)
asyncRetrieve.cancel(true);
asyncRetrieve = new AsyncRetrieve();
result = asyncRetrieve.execute().get();
}
catch (ExecutionException | InterruptedException e) {
Sentry.capture(e);
e.printStackTrace();
}
return result;
}
public static class AsyncRetrieve extends AsyncTask<String, Void, String> {
HttpsURLConnection conn;
URL url = null;
// This method does not interact with UI, You need to pass result to onPostExecute to display
@Override
protected String doInBackground(String... params) {
.....
}
}
}
任何对 asyncRetrieve.cancel () 的调用都会返回以下错误
E/AndroidRuntime: FATAL EXCEPTION: Thread-9
Process: com.example.wedos, PID: 6709
java.util.concurrent.CancellationException
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:193)
at android.os.AsyncTask.get(AsyncTask.java:542)
at com.example.xyz.dataGetter.getData(dataGetter.java:45)
at com.example.xyz.ui.domains.DomainsFragment.getDetails(DomainsFragment.java:195)
at com.example.xyz.ui.domains.DomainsFragment.access$100(DomainsFragment.java:36)
at com.example.xyz.ui.domains.DomainsFragment$1.run(DomainsFragment.java:74)
at java.lang.Thread.run(Thread.java:764)
我试图在互联网上搜索,但不幸的是没有。有人会建议我如何取消异步任务,以便前一个 fragment 中的数据不会出现在新 fragment 中吗?
提前非常感谢
编辑
第一个 fragment “域”
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
//new ViewModelProvider(this).get(DomainsViewModel.class);
root = inflater.inflate(R.layout.fragment_domains, container, false);
context = root.getContext();
setHasOptionsMenu(true);
models = new ArrayList<>();
result = new ArrayList<>();
progressBar = root.findViewById(R.id.loading);
viewPager2 = root.findViewById(R.id.viewPager);
tabLayout = root.findViewById(R.id.tabs);
linearLayout = root.findViewById(R.id.DomainsLinearLayout);
thread = new Thread(new Runnable() {
@Override public void run() {
try {
getData();
} catch (JSONException e) {
Sentry.capture(e);
e.printStackTrace();
}
for (String domena : result) {
try {
getDetails(domena);
} catch (JSONException e) {
Sentry.capture(e);
e.printStackTrace();
}
}
}
});
thread.start();
check();
return root;
}
@Override
public void onDestroy() {
super.onDestroy();
asyncRetrieve.cancel(true);
System.out.println("On Destroy");
if (thread.isAlive())
thread.interrupt();
}
第二个 fragment “现金”
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
//new ViewModelProvider(this).get(CashViewModel.class);
View root = inflater.inflate(R.layout.fragment_cash, container, false);
context = root.getContext();
setHasOptionsMenu(true);
textView = root.findViewById(R.id.cash_amount);
progressBar = root.findViewById(R.id.loading);
linearLayout = root.findViewById(R.id.CashLinearLayout);
Button cashHistory = root.findViewById(R.id.showHistory);
cashHistory.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int index = result.indexOf(' ');
Intent i = new Intent(context, CashHistoryActivity.class);
i.putExtra("CURRENCY", result.substring(index));
startActivity(i);
}
});
thread = new Thread(new Runnable() {
@Override
public void run() {
getData();
}
});
thread.start();
return root;
}
getData()方法
result = dataGetter.getData(context, "cashCheck", "", false, "", "");
最新错误
I/System.out: On Destroy
E/AndroidRuntime: FATAL EXCEPTION: Thread-12
Process: com.example.wedos, PID: 9115
java.util.concurrent.CancellationException
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:193)
at android.os.AsyncTask.get(AsyncTask.java:542)
at com.example.wedos.dataGetter.getData(dataGetter.java:45)
at com.example.wedos.ui.cash.CashFragment.getData(CashFragment.java:90)
at com.example.wedos.ui.cash.CashFragment.access$200(CashFragment.java:25)
at com.example.wedos.ui.cash.CashFragment$2.run(CashFragment.java:59)
at java.lang.Thread.run(Thread.java:764)
D/io.sentry.android.event.helper.AndroidEventBuilderHelper: Proguard UUIDs file not found.
W/System.err: SLF4J: Failed to load class "org.slf4j.impl.StaticMDCBinder".
SLF4J: Defaulting to no-operation MDCAdapter implementation.
SLF4J: See http://www.slf4j.org/codes.html#no_static_mdc_binder for further details.
W/System.err: java.lang.InterruptedException
at java.util.concurrent.FutureTask.awaitDone(FutureTask.java:420)
at java.util.concurrent.FutureTask.get(FutureTask.java:192)
at android.os.AsyncTask.get(AsyncTask.java:542)
at com.example.wedos.dataGetter.getData(dataGetter.java:45)
at com.example.wedos.ui.domains.DomainsFragment.getDetails(DomainsFragment.java:198)
at com.example.wedos.ui.domains.DomainsFragment.access$100(DomainsFragment.java:38)
at com.example.wedos.ui.domains.DomainsFragment$1.run(DomainsFragment.java:76)
at java.lang.Thread.run(Thread.java:764)
I/Process: Sending signal. PID: 9115 SIG: 9
最佳答案
我建议删除 dataGetter
类并删除运行 AsyncTask
的额外 Thread
。由于处理 API 响应的方式取决于 fragment ,因此您应该创建一个公共(public)基类,例如AsyncReceiver
在单独的文件中。
public class AsyncRetrieve extends AsyncTask<String, Void, String> {
private Context context;
private Domain domain;
// etc.
public AsyncRetrieve(Context context, String domain, boolean login, String email, String password) {
this.context = context;
this.url = url;
this.domain = domain;
// etc.
}
@Override
public String doInBackground(String... params) {
return fetchData("domainList");
}
private String fetchData(String url) {
// do what you originally did in the old doInBackground
// of the old AsyncRetriever class, but use the url argument
// passed to this method
return result;
}
}
然后,在您的 fragment 中添加实现 onPostExecute
方法的 AsyncReceiver
的私有(private)扩展子类。您可以在其中处理 API 响应并相应地更新您的 View 。
例如:
public class DomainsFragment extends Fragment {
private DomainsAsyncReceiver receiver;
// example text view that is updated on results
private TextView tv_results;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// instantiate your views
// e.g.
tv_results = findViewById(R.id.tv_results);
// etc.
// instantiate the async task
receiver = new DomainsAsyncReceiver(domain, url, etc.);
receiver.execute();
}
@Override
public void onDestroy() {
super.onDestroy();
// cancel the async task
receiver.cancel(true);
}
private class DomainsAsyncReceiver extends AsyncRetrieve {
@Override
protected String doInBackground(String... params) {
String result = fetchData("domainList");
// do something with the result, e.g.
String details = fetchData("domainDetails");
return details;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
tv_results.setText(result);
}
}
}
关于java - 无法使用asyncTask.cancel(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61338680/
我通过 spring ioc 编写了一些 Rest 应用程序。但我无法解决这个问题。这是我的异常(exception): org.springframework.beans.factory.BeanC
我对 TestNG、Spring 框架等完全陌生,我正在尝试使用注释 @Value通过 @Configuration 访问配置文件注释。 我在这里想要实现的目标是让控制台从配置文件中写出“hi”,通过
为此工作了几个小时。我完全被难住了。 这是 CS113 的实验室。 如果用户在程序(二进制计算器)结束时选择继续,我们需要使用 goto 语句来到达程序的顶部。 但是,我们还需要释放所有分配的内存。
我正在尝试使用 ffmpeg 库构建一个小的 C 程序。但是我什至无法使用 avformat_open_input() 打开音频文件设置检查错误代码的函数后,我得到以下输出: Error code:
使用 Spring Initializer 创建一个简单的 Spring boot。我只在可用选项下选择 DevTools。 创建项目后,无需对其进行任何更改,即可正常运行程序。 现在,当我尝试在项目
所以我只是在 Mac OS X 中通过 brew 安装了 qt。但是它无法链接它。当我尝试运行 brew link qt 或 brew link --overwrite qt 我得到以下信息: ton
我在提交和 pull 时遇到了问题:在提交的 IDE 中,我看到: warning not all local changes may be shown due to an error: unable
我跑 man gcc | grep "-L" 我明白了 Usage: grep [OPTION]... PATTERN [FILE]... Try `grep --help' for more inf
我有一段代码,旨在接收任何 URL 并将其从网络上撕下来。到目前为止,它运行良好,直到有人给了它这个 URL: http://www.aspensurgical.com/static/images/a
在过去的 5 个小时里,我一直在尝试在我的服务器上设置 WireGuard,但在完成所有设置后,我无法 ping IP 或解析域。 下面是服务器配置 [Interface] Address = 10.
我正在尝试在 GitLab 中 fork 我的一个私有(private)项目,但是当我按下 fork 按钮时,我会收到以下信息: No available namespaces to fork the
我这里遇到了一些问题。我是 node.js 和 Rest API 的新手,但我正在尝试自学。我制作了 REST API,使用 MongoDB 与我的数据库进行通信,我使用 Postman 来测试我的路
下面的代码在控制台中给出以下消息: Uncaught DOMException: Failed to execute 'appendChild' on 'Node': The new child el
我正在尝试调用一个新端点来显示数据,我意识到在上一组有效的数据中,它在数据周围用一对额外的“[]”括号进行控制台,我认为这就是问题是,而新端点不会以我使用数据的方式产生它! 这是 NgFor 失败的原
我正在尝试将我的 Symfony2 应用程序部署到我的 Azure Web 应用程序,但遇到了一些麻烦。 推送到远程时,我在终端中收到以下消息 remote: Updating branch 'mas
Minikube已启动并正在运行,没有任何错误,但是我无法 curl IP。我在这里遵循:https://docs.traefik.io/user-guide/kubernetes/,似乎没有提到关闭
每当我尝试docker组成任何项目时,都会出现以下错误。 我尝试过有和没有sudo 我在这台机器上只有这个问题。我可以在Mac和Amazon WorkSpace上运行相同的容器。 (myslabs)
我正在尝试 pip install stanza 并收到此消息: ERROR: No matching distribution found for torch>=1.3.0 (from stanza
DNS 解析看起来不错,但我无法 ping 我的服务。可能是什么原因? 来自集群中的另一个 Pod: $ ping backend PING backend.default.svc.cluster.l
我正在使用Hibernate 4 + Spring MVC 4当我开始 Apache Tomcat Server 8我收到此错误: Error creating bean with name 'wel
我是一名优秀的程序员,十分优秀!