- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包含列表的 fragment ,对于这个列表,我希望在加载列表时显示加载图标,然后再显示列表。这是我的列表 fragment 布局,通过在 fragment 的 onCreateView() 中调用 View rootView = inflater.inflate(R.layout.main_list_card, container, false);
来膨胀。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity$DummySectionFragment"
android:layout_gravity="center">
<ListView
android:id="@+id/mainList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@android:color/transparent"
android:dividerHeight="6dp"
android:listSelector="@android:color/transparent"
android:visibility="invisible"/>
<ProgressBar
android:id="@+id/loadingIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
</FrameLayout>
我的想法是调用 list.setVisibility(View.INVISIBLE);和 bar.setVisibility(View.VISIBLE);在加载列表时,加载后相反。我的异步任务按以下方式调用(在 fragment 的 onResume() 中调用):
InstalledAppsLoader loader = new InstalledAppsLoader(bar, list);
loader.execute();
try {
apps = loader.get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
问题是一旦调用此方法,UI 线程就会完全卡住并且甚至不会更改 View ,然后在加载后我会看到加载图标闪烁,然后显示列表并且加载图标消失。我不确定我的 fragment 中的 onCreateView 是否在之后被调用或其他什么,但我试图让它在 fragment 创建时被调用,它显示列表加载。 InstalledAppsLoader 类如下所示:
public class InstalledAppsLoader extends AsyncTask<Void, Void, List<App>>{
private ProgressBar bar;
private ListView list;
public InstalledAppsLoader(ProgressBar bar, ListView list)
{
this.bar = bar;
this.list = list;
}
@Override
protected void onPreExecute() {
bar.setVisibility(View.VISIBLE);
list.setVisibility(View.INVISIBLE);
super.onPreExecute();
}
@Override
protected List<App> doInBackground(Void... params) {
return MainFragment.getInstalledApps();
}
@Override
protected void onPostExecute(List<App> result) {
bar.setVisibility(View.INVISIBLE);
list.setVisibility(View.VISIBLE);
super.onPostExecute(result);
}
}
我已经坚持了一段时间,因为并发编程对我来说是一个相对较新的想法,所以非常感谢任何帮助!
最佳答案
正因为如此,
try {
apps = loader.get();
}
因为AsyncTask的.get()
方法是UI线程阻塞方法。它不会异步运行您的 AsyncTask。
您还调用了 AsyncTask 两次。
loader.execute(); // 1
try {
apps = loader.get(); // 2 time
}
从 UI 线程中删除 apps = loader.get();
并在 AsyncTask 的 onPostExecute()
中使用 apps
成员。
编辑:
@Override
protected void onPostExecute(List<App> result) {
apps = result; // Use apps here
bar.setVisibility(View.INVISIBLE);
list.setVisibility(View.VISIBLE);
super.onPostExecute(result);
}
关于android - AsyncTask 在线程完成之前不调用 onPreExecute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22140120/
我有两个 AsyncTask Activity ,它们的唯一职责是在 UI 线程上执行 AsyncTask。其中之一效果很好,显示进度条,并更新进度条消息。这是针对我的 SearchActivity,
我有一个 AsyncTask,它应该在通过 Internet 上传一些内容时显示进度条。有时它就像一个魅力,有时它不显示任何进度条。这是代码: public class Upload extends
我有一个包含列表的 fragment ,对于这个列表,我希望在加载列表时显示加载图标,然后再显示列表。这是我的列表 fragment 布局,通过在 fragment 的 onCreateView()
所以,我的 AsyncTask 如下: private class AsyncRetriever extends AsyncTask{ ProgressDialog pDialog;
class AddStudent extends AsyncTask { private ProgressDialog pDialog; @Override protected void onPreE
我在 onPreExecute() 中检查互联网连接状态,如果没有互联网连接,它不应该执行 doInBackground() 和 onPostExecute() new getStatus().exe
当 onPreExecute 函数执行时我有一个 AsyncTask,它给我一个异常 ** java.lang.IllegalStateException: View com.android.inte
由于某些原因,没有调用 onPreExecute。代码: protected void onPreExcecute() { hook.createDialog(ticker); } 全类: p
使用 android.os.AsyncTask 时,即使任务通过executeOnExecutor() 发布到单个线程池,onPreExecute() 方法也会异步执行。这是有意的行为吗? Googl
我看到 .get() 是问题所在,但我在没有他的情况下尝试过,但什么也没有。如果可能的话帮助我。 ProgressDialog 在 doInBackground() 之后执行并在运行 onPostEx
volley 中有没有像 AsyncTask 这样的方法? 我在我的应用程序中使用了 volley 库,我想在 volley 中做一些预执行。那么在 AsyncTask 中的 volley lib 广
我得到一个 java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prep
我正在使用 Android HoneyComb。我需要并行执行一些任务,我正在使用 AsyncTask 的public final AsyncTask executeOnExecutor (Execu
我使用 AsyncTask 来加载我作为内部类实现的操作。 在 onPreExecute() 中,我显示了一个加载对话框,然后我将其再次隐藏在 onPostExecute() 中。但是对于一些加载操作
异步任务中的代码: @Override protected void onPreExecute() { super.onPreExecute(); Sc
我有 MainActivity.java Activity 类,它在应用程序启动时加载。我在名为 ServerOperation.java 的单独文件中使用 asyncTask 方法。我需要在 asy
我想将 onPreExecute AsyncTask 添加到 SherlockFragment,但它会导致错误。我的代码如下。在 preExecute AsyncTask 上添加对话框的这段代码有什么
在我的自定义 DialogPreference 中,我使用执行 AsyncTask 的自定义 View.onClickListener 覆盖肯定按钮的 onClick 事件。我的类(class)大致如
当 AsyncTask 在 onPreExecute() 中启动时,我试图让 ProgressDialog 出现,在 doInBackground() 中做一些事情,并在 onPostExecute(
我是这个网站的新手。我的 AsyncTask 和我的 android 程序有一个错误...这是我编写的第一个异步任务。 名为 SocialApp.java 的主类 @Override public v
我是一名优秀的程序员,十分优秀!