我试图了解AsyncTaskLoaders的一些细节.对于其他人来说,这可能是显而易见的,但我无法找到一个明确的示例或定义来演示和夸大当您覆盖该deliverResult()方法时会发生什么.实际交付的是什么?它如何与调用对象交互?我可以看到使用super.deliverResult,它从类中传递一个私有对象.那么,加载器是否自动知道与"交付结果"相关联的内容.我完全糊涂了.
首先是问题:
FragmentLists
自定义中使用多个的应用程序FragmentStatePagerAdapter.可能有大量此类碎片在20到40之间.我的第一个实现遵循着名的谷歌图像加载器代码.我的代码问题是它基本上创建了AsyncTask每个图像的一个实例.在我的情况下,这快速杀死应用程序.
由于我使用的是v4兼容包,我认为使用扩展的自定义Loader AsyncTaskLoader会对我有所帮助,因为它内部实现了一个线程池.但令我不愉快的是,如果我执行此代码多次,每次调用后都会中断前一次.说我的ListView#getView方法中有这个:
getSupportLoaderManager().restartLoader(0, args, listener);
Run Code Online (Sandbox Code Playgroud)
对于进入视图的每个列表项,在循环中执行此方法.正如我所说 - 以下每次调用都会终止前一个调用.或者至少这是基于LogCat发生的事情
11-03 13:33:34.910: V/LoaderManager(14313): restartLoader in LoaderManager: args=Bundle[{URL=http://blah-blah/pm.png}]
11-03 13:33:34.920: V/LoaderManager(14313): Removing pending loader: LoaderInfo{405d44c0 #2147483647 : ImageLoader{405118a8}}
11-03 13:33:34.920: V/LoaderManager(14313): Destroying: LoaderInfo{405d44c0 #2147483647 : ImageLoader{405118a8}}
11-03 13:33:34.920: V/LoaderManager(14313): Enqueuing as new pending loader
Run Code Online (Sandbox Code Playgroud)
然后我认为可能给每个装载机提供唯一的ID将有助于事情,但它似乎没有任何区别.结果我最终得到看似随机的图像,应用程序永远不会加载我需要的1/4.
问题
AsyncTask池的好方法,是否可能正在实施它?为了让您了解这里的代码是剥离版本的Loader,其中实际的下载/保存逻辑位于单独的ImageManager类中.
public class ImageLoader extends AsyncTaskLoader<TaggedDrawable> {
private static final String TAG = ImageLoader.class.getName();
/** Wrapper …Run Code Online (Sandbox Code Playgroud) 他们告诉我们应该使用ASyncTaskLoaders,因为他们非常善于阻止UI线程.现在有Volley使用.
我想我们不能同时使用它们,因为Volley自己做了背景.你怎么看?哪一个更好?
我正在尝试将params传递给AsyncTaskLoader.我怎么做?
目前,我正在将我需要传递的内容放在一个单独的静态类中.无论如何围绕这个?
public class NewsAsyncTaskLoader extends AsyncTaskLoader<List<Content>> {
private static final DbHelper dbHelper = DbHelperFactory.getDbHelper();
public FeedAsyncTaskLoader(Context context) {
super(context);
}
@Override
public List<Content> loadInBackground() {
List<Content> contents = DbHelper.getStream(FeedSections.getInstance().getCurrentSection());
feed.setContents(contents);
return feed;
}
}
Run Code Online (Sandbox Code Playgroud) 我注意到AsyncTaskLoader,Loader和LoaderManager的以下函数:
事情是,我不明白他们的工作方式:
我考虑了使用AsyncTaskLoader和Fragment(https://gist.github.com/codeswimmer/884591)的一些例子,我试图做同样的事情.但是现在我无法修复不兼容的类型错误 - 在onCreateLoader方法中.我不知道为什么会这样,因为我也做了同样的事情.
FeedLoader.java
public class FeedLoader extends AsyncTaskLoader<ArrayList<RSSItemData>> {
ArrayList<RSSItemData> listData;
Context ctx;
RSSItemData rssItem;
final Integer HTTP_CONNECTION_TIMEOUT = 15;
DBHelper dbHelper;
public FeedLoader(Context context) {
super(context);
this.ctx = context;
dbHelper = new DBHelper(ctx);
}
@Override
public ArrayList<RSSItemData> loadInBackground() {
listData = new ArrayList<RSSItemData>();
if(!BaseUtils.isNetworkAvailable(ctx)) return getNewsFromDB();
if(doWeHaveAnyNews()){
Log.d("myLogs", "We have news!");
String data = JSONUtils.getJSON("http://I-changed-URL.com", HTTP_CONNECTION_TIMEOUT*1000, ctx);
JSONResult result = new Gson().fromJson(data, JSONResult.class);
listData = result.items;
deleteAllNewsFromDB();
putNewsIntoDB(listData);
}
else{
Log.d("myLogs", "No news, retrieve from database"); …Run Code Online (Sandbox Code Playgroud) 我已将我转换AsyncTask为AsyncTaskLoader(主要用于处理配置更改).我有TextView我使用的进展状况,并使用onProgressUpdate在AsyncTask更新它.它看起来不像AsyncTaskLoader是等价的,所以在loadInBackground(AsyncTaskLoader我)使用它时:
getActivity().runOnUiThread(new Runnable() {
public void run() {
((TextView)getActivity().findViewById(R.id.status)).setText("Updating...");
}
});
Run Code Online (Sandbox Code Playgroud)
我正在使用它Fragment,这就是我使用的原因getActivity().这项工作非常顺利,除非发生配置更改,例如更改屏幕方向.我AsyncTaskLoader一直在跑(这就是为什么我正在使用AsyncTaskLoader),但runOnUiThread似乎被跳过了.
不知道为什么会被跳过,或者这是从更新UI的最佳方式 AsyncTaskLoader.
更新:
我最终恢复了一个,AsyncTask因为它似乎更适合UI更新.希望他们能将合并的东西合并到AsyncTask一起AsyncTaskLoader.
第4个小时的搜索,没有结果都一样.我们不应该这样做的事实.告诉我如何实现以下内容:

有片动画xml:
Run Code Online (Sandbox Code Playgroud)<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true" android:layout_width="wrap_content" android:layout_height="wrap_content"> <item android:drawable="@drawable/a1" android:duration="250"/> <item android:drawable="@drawable/a2" android:duration="250"/> <item android:drawable="@drawable/a3" android:duration="250"/> <item android:drawable="@drawable/a4" android:duration="250"/> <item android:drawable="@drawable/a5" android:duration="250"/> <item android:drawable="@drawable/a6" android:duration="250"/> <item android:drawable="@drawable/a7" android:duration="250"/> <item android:drawable="@drawable/a8" android:duration="250"/> <item android:drawable="@drawable/a9" android:duration="250"/> <item android:drawable="@drawable/a10" android:duration="250"/> <item android:drawable="@drawable/a11" android:duration="250"/> <item android:drawable="@drawable/a12" android:duration="250"/> <item android:drawable="@drawable/a13" android:duration="250"/> <item android:drawable="@drawable/a14" android:duration="250"/> <item android:drawable="@drawable/a15" android:duration="250"/> <item android:drawable="@drawable/a16" android:duration="250"/> <item android:drawable="@drawable/a17" android:duration="250"/> <item android:drawable="@drawable/a18" android:duration="250"/> <item android:drawable="@drawable/a19" android:duration="250"/> <item android:drawable="@drawable/a20" android:duration="250"/> <item android:drawable="@drawable/a21" android:duration="250"/> <item android:drawable="@drawable/a22" android:duration="250"/> <item android:drawable="@drawable/a23" android:duration="250"/> <item android:drawable="@drawable/a24" …
customization android asynctaskloader progress-bar animationdrawable
我不明白所做的所有功能AsyncTaskLoader,例如onCancelLoad()和onForceLoad().所有功能及其调用顺序均未正确记录.
假设我想在后台下载文件并在需要时取消它.onCancelLoad()已经有了 什么目的cancelLoadInBackground().
android android-asynctask asynctaskloader android-loadermanager android-loader
在我的旧项目中,我使用了 AsyncTask,但它已被弃用,那么我使用什么方法来代替这个呢?如果我们使用线程,则在 AsyncTask 中具有 onbackground、onPreExecute 和 onPostExecute Override 方法,其中本节在线程中调用。有没有什么替代方法。你能给我解决方案吗?
Java代码:
public class getDetailsfromWeb extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... params) {
if (paymentSync == null)
paymentSync = new ReceivePaymentSync(getActivity());
allCreditCardModel = new AllCreditCardModel();
allCreditCardModel = paymentSync.getGetCreditCardById(CrediCardId);
handler.post(allCreditRunnable);
return null;
}
/**
* @param string
*/
public void execute(String string) {
// TODO Auto-generated method stub
}
protected void onPreExecute() {
showProgress();
}
@Override
protected void onPostExecute(String result) {
progress.dismiss();
}
}
Run Code Online (Sandbox Code Playgroud)