我有一个AsyncTaskLoader<List<String>>
成员变量List<String>
mAddresses.在loadInBackground
,如果我创建一个新对象,填充它,并返回它; onLoadFinished
按预期调用,所以我可以更新适配器,然后更新视图.
public List<String> loadInBackground()
{
// ListView updates properly only if I do this (strange?)
mAddresses = new ArrayList<String>();
// ... fill mAddresses ...
return mAddresses;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使用相同的变量,即使它的值发生变化也会onLoadFinished
被调用:
public List<String> loadInBackground()
{
// ListView does not update with this!
if(mAddresses == null)
{
mAddresses = new ArrayList<String>();
}
// ... fill mAddresses ...
return mAddresses;
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以评论这个吗?我是否应该像这样创建一个新对象来返回?是否有任何标志我可以设置"对象已更改,所以即使它是同一个对象,请确保执行所有更新?
android asynctaskloader android-loadermanager android-loader
我想在Activity中使用不同的AsyncTaskLoader(返回类型不同),实现回调方法的最佳方法是什么?
这不起作用:
公共类MyActivity扩展Activity实现LoaderManager.LoaderCallbacks <MyPojo>,LoaderManager.LoaderCallbacks <MyOtherPojo>
Eclipse说
The interface LoaderCallbacks cannot be implemented more than once with different arguments
Run Code Online (Sandbox Code Playgroud)
那我该怎么办?我的想法是制作活动
实现LoaderManager.LoaderCallbacks <Object>
然后检查回调方法它是什么类型的对象,但这似乎并不太优雅.有没有更好的办法?
目前我正在使用异步http库来对我们的服务器执行http请求.然而,这会带来一个问题,即如果在屏幕旋转期间正在进行http调用,我们将在调用结束时引用旧的上下文.我通过保持对onCreate中捕获的最新实例的静态引用来解决这个问题,并使用该引用调用方法(并在onDestroy中将其置空).它运作正常但似乎是一个黑客.我见过有人推荐使用片段来解决这个问题,比如这里:
http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
这似乎是好主意,但我想我可以通过简单地让我的Activity扩展FragmentActivity并使用AsyncTaskLoader子类来实现这一点,该子类专门用于我正在做的事情.
这是我的想法:使用ApiRequest实现AsyncTaskLoader并返回ApiResponse.但是,我希望能够继承HttpAsyncTask并覆盖一个解析响应的方法,这样我就可以解析响应并将其转换为另一种扩展ApiResponse的对象.我不知道如何指定类型参数来实现这一点.
这是我的代码:
public class HttpAsyncTaskLoader</*not sure what to put here*/> extends AsyncTaskLoader<? not sure ?> {
private ApiClient mClient ;
private ApiRequest mRequest;
private volatile boolean isExecuting = false;
public HttpAsyncTaskLoader(Context context, ApiClient client, ApiRequest request) {
super(context);
mClient = client;
mRequest = request;
}
/**
* Subclasses should override this method to do additional parsing
* @param response
* @return
*/
protected /*subclass of ApiResponse (or ApiResponse itself)*/ onResponse(ApiResponse response)
{
//base implementation just returns the …
Run Code Online (Sandbox Code Playgroud) 在我看来,我并没有真正从MainActivity调用URL,网络操作.
但例外仍然发生:
public class MainActivity extends ActionBarActivity {
private final String LOG_TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ProcessData test = new ProcessData();
test.doInBackground("mysql") ;
}
//separate file ProcessData.java
public class ProcessData extends AsyncTask<String, Void, String> {
public String createValidUrl(String s){
.....//code in this method works fine
}
public String doInBackground(String ...params){
String validUrl = createValidURL(params[0]);
HttpURLConnection urlConnection = null;
BufferedReader reader = null;
URL url = new URL(validUrl);
urlConnection = …
Run Code Online (Sandbox Code Playgroud) android android-asynctask asynctaskloader networkonmainthread
建立:
我有一个单例应用程序类,它有一个名为的方法fetchUpdates()
.此方法由UpdaterService
(IntentService)类调用.fetchUpdates()
方法只是调用DownloadDataAsyncTask,然后UpdateDbAsyncTask
在onPostExecute
数据成功下载期间调用.两个AsyncTasks都驻留在应用程序类中(不确定这是否与问题相关).
public synchronized void fetchUpdates() {
String[] mURLs = getURLs();
new DownloadDataAsyncTask().execute(mURLs[0], mURLs[1]);
}
Run Code Online (Sandbox Code Playgroud)
DownloadDataAsyncTask类
private class DownloadDataAsyncTask extends AsyncTask<String, Void, JSONObject[]> {
@Override
protected synchronized JSONObject[] doInBackground(String... params) {
String urlData = (String) params[0];
String urlId = (String) params[1];
JSONObject[] jSON = new JSONObject[] {
JSONfunctions.getJSONfromURL(urlData),
JSONfunctions.getJSONfromURL(urlId) };
return mJSON;
}
@Override
protected void onPostExecute(JSONObject[] result) {
if (result[0] != null && result[1] != null) {
new UpdateDbAsyncTask().execute(result[0], …
Run Code Online (Sandbox Code Playgroud) 根据Android文档,Android P中不推荐使用AsyncTaskLoader。有人可以告诉我为什么不推荐使用AsyncTaskLoader吗?
编辑-Google现在建议使用ViewModel而不是Loader,这是它们被弃用的原因
android background asynctaskloader android-loader android-9.0-pie