我正在尝试找出运行后台任务的最佳方法,同时显示微调器对话框并处理更改,例如设备的旋转或设备是否进入屏幕锁定然后解锁状态。
目前我的应用程序必须使用API 8,最多16个,所以我知道getLastNonConfigurationInstance()现在是api 11(我认为)的冗余,我尝试了这个方法,以确保它不适用于API它没有的8个设备。然后我阅读了关于asynctaskloader的内容,但这不适用于API 8。
最后我读到了看起来可能是答案的intentservice,但我只需要知道如何通过重新启动活动的配置更改来处理这个问题。
我的后台任务是循环访问sqlite数据库并将行导出为CSV或从CSV导入。这些我已经通过AsyncTask完成了但是如果我旋转设备或锁定屏幕,它们会崩溃。
当Activity重新启动时,我怀疑如果我使用了一个intentservice,它就需要知道新的活动“reference”。使用AsyncTask我的理解是它附加到启动它的活动,因此当它重新创建时它会丢失该链接。
修改 的 **
由于我的原始问题,Marcin帮助解决了我遇到的一些问题。但是,看起来片段活动示例的链接与可下载的源代码不匹配,所以我的问题如下:
我正在尝试研究如何在listactivity中实现片段。我知道有一个Listfragment,但是如果我将listactivity改为this,我将无法从一个活动启动listfragment,因为我已经尝试过这个并且在这里阅读帖子除非listfragment在一个活动中,否则无法完成片段活动。
片段的原因是控制配置更改,listactivity用于显示文件和文件夹列表,然后用户可以选择要使用的文件,单击import然后我需要启动片段将有asynctask导入数据。
我还没有找到一个listactivity的例子,其中一个片段显示了这一点,我试图解决这个问题。
如果您需要我项目中的任何代码,请告诉我
由于
TimCS
答案 0 :(得分:0)
看看setRerainInstance()。您可以将AsyncTask放入其中,之后不会重新创建 配置更改。您还可以阅读this帖子,这可能会有所帮助
package com.example.we.helpers;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import com.example.we.MainActivity;
public class ImageFragment extends Fragment{
public static final String URL = "http://link.com";
private ImageTask task;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
public void startDownloading(){
task = new ImageTask();
task.execute();
}
public class ImageTask extends AsyncTask<Void, Void, Bitmap>{
@Override
protected Bitmap doInBackground(Void... arg0) {
Bitmap bmp =null;
try{
URL ulr = new URL(URL);
HttpURLConnection con = (HttpURLConnection)ulr.openConnection();
InputStream is = con.getInputStream();
bmp = BitmapFactory.decodeStream(is);
}catch(Exception e){
e.printStackTrace();
}
return bmp;
}
@Override
protected void onPostExecute(Bitmap result) {
if(getActivity() instanceof MainActivity == false){
return;
}
MainActivity activity = (MainActivity) getActivity();
activity.onImageLoaded(result);
}
}
}
这就是我运行Fragment的方式:
ImageFragment fragment = new ImageFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(fragment, LOADER);
transaction.commit();
fragment.startDownloading();
这是从MainActivity导入的:
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;