gpt4 book ai didi

android - AsyncTask 在线程完成之前不调用 onPreExecute

转载 作者:行者123 更新时间:2023-11-29 17:52:08 26 4
gpt4 key购买 nike

我有一个包含列表的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com