Android 分段异步任务
Im使用文章中描述的方法,在Fragment的异步任务中下载和解析html页面。在emulator上一切正常,但后来我在Galaxy S2上试用了它。当我旋转我的设备时,listview不会被刷新,如果我将设备旋转回来,它会被刷新 下面是我如何在onCreate(LinksDownloader-用于解析html的类)中使用片段的代码Android 分段异步任务,android,android-fragments,android-asynctask,Android,Android Fragments,Android Asynctask,Im使用文章中描述的方法,在Fragment的异步任务中下载和解析html页面。在emulator上一切正常,但后来我在Galaxy S2上试用了它。当我旋转我的设备时,listview不会被刷新,如果我将设备旋转回来,它会被刷新 下面是我如何在onCreate(LinksDownloader-用于解析html的类)中使用片段的代码 FragmentManager fm=getSupportFragmentManager(); mTaskFragment=(DownloadLinksTaskFr
FragmentManager fm=getSupportFragmentManager();
mTaskFragment=(DownloadLinksTaskFragment)fm.findFragmentByTag(“任务”);
如果(mTaskFragment==null){
mTaskFragment=新下载的linkstaskfragment();
mTaskFragment.linksDownloader=新的linksDownloader();
fm.beginTransaction().add(mTaskFragment,“任务”).commit();
}
...
goButton.setOnClickListener(新建Button.OnClickListener(){
公共void onClick(视图v){
mTaskFragment.execute();
}
});
...
linksAdapter=newarrayadapter(MainActivity.this,android.R.layout.simple\u list\u item\u 1,mTaskFragment.linksDownloader.linksArray);
设置适配器(linksAdapter);
和片段类
public class DownloadLinksTaskFragment extends Fragment {
static interface TaskCallbacks {
void onPreExecute();
void onPostExecute(Byte mssg);
}
private TaskCallbacks mCallbacks;
private DownloadLinksTask mTask;
public LinksDownloader linksDownloader;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mCallbacks = (TaskCallbacks) activity;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public void onDetach() {
super.onDetach();
mCallbacks = null;
}
public void execute() {
mTask = new DownloadLinksTask();
mTask.execute();
}
private class DownloadLinksTask extends AsyncTask<Void, Void, Byte> {
@Override
protected void onPreExecute() {
if (mCallbacks != null) {
mCallbacks.onPreExecute();
}
}
@Override
protected void onPostExecute(Byte b) {
if (mCallbacks != null) {
mCallbacks.onPostExecute(b);
}
}
@Override
protected Byte doInBackground(Void... v) {
byte exceptionType = 0;
try {
linksDownloader.download();
} catch (HttpStatusException e) {
exceptionType = 1;
} catch (WrongContentException e) {
exceptionType = 2;
} catch (ConnectTimeoutException e) {
exceptionType = 3;
} catch (SocketTimeoutException e) {
exceptionType = 3;
} catch (UnknownHostException e) {
exceptionType = 3;
} catch (IOException e) {
exceptionType = 4;
} catch (Exception e) {
exceptionType = 5;
}
return exceptionType;
}
}
}
public类下载linkstaskfragment扩展片段{
静态接口任务回调{
void onPreExecute();
void onPostExecute(字节mssg);
}
专用任务回调mCallbacks;
私人下载链接STASK mTask;
公共链接下载器链接下载器;
@凌驾
公共事务主任(活动){
超级转速计(活动);
mCallbacks=(TaskCallbacks)活动;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setRetainInstance(真);
}
@凌驾
公共无效连接(){
super.onDetach();
mCallbacks=null;
}
public void execute(){
mTask=新下载链接STASK();
mTask.execute();
}
私有类下载LinkStask扩展异步任务{
@凌驾
受保护的void onPreExecute(){
如果(mCallbacks!=null){
mCallbacks.onPreExecute();
}
}
@凌驾
受保护的void onPostExecute(字节b){
如果(mCallbacks!=null){
onPostExecute(b);
}
}
@凌驾
受保护字节doInBackground(无效…v){
字节异常类型=0;
试一试{
linksDownloader.download();
}捕获(HttpStatus异常){
exceptionType=1;
}捕获(错误){
例外类型=2;
}捕获(ConnectTimeoutException e){
例外类型=3;
}捕获(SocketTimeoutException e){
例外类型=3;
}捕获(未知后异常e){
例外类型=3;
}捕获(IOE异常){
例外类型=4;
}捕获(例外e){
例外类型=5;
}
返回异常类型;
}
}
}
您可以为此创建回调接口,并在活动中实现该接口。在片段中创建该接口的引用,并在片段中使用DownloadLinksTask
的onPostExecute()
中的接口强制转换getActivity()
。在活动调用中该接口的重写方法中,调用linksAdapter.notifyDataSetChanged()
刷新列表视图内容
希望这有助于您可以为此创建一个回调接口,并在活动中实现它。在片段中创建该接口的引用,并在片段中使用
DownloadLinksTask
的onPostExecute()
中的接口强制转换getActivity()
。在活动调用中该接口的重写方法中,调用linksAdapter.notifyDataSetChanged()
刷新列表视图内容
希望这能有所帮助您的实现即使没有错误,至少也会引起争议 您试图做的是创建片段,该片段的唯一作用是下载数据
您应该将部分UI处理(在案例列表视图中)移动到此片段(ListFragment是合适的)。更好的方法是编写
AsyncTaskLoader
的实现,并将LoaderCallback
添加到您的片段中,这样您就不用担心屏幕旋转和编写自己的接口和/或处理程序了。您的实现即使没有错,至少也有争议
您试图做的是创建片段,该片段的唯一作用是下载数据
您应该将部分UI处理(在案例列表视图中)移动到此片段(ListFragment是合适的)。更好的方法是编写AsyncTaskLoader
的实现,并将LoaderCallback
添加到片段中,这样就不用担心屏幕旋转和编写自己的接口和/或处理程序
public class DownloadLinksTaskFragment extends Fragment {
static interface TaskCallbacks {
void onPreExecute();
void onPostExecute(Byte mssg);
}
private TaskCallbacks mCallbacks;
private DownloadLinksTask mTask;
public LinksDownloader linksDownloader;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mCallbacks = (TaskCallbacks) activity;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public void onDetach() {
super.onDetach();
mCallbacks = null;
}
public void execute() {
mTask = new DownloadLinksTask();
mTask.execute();
}
private class DownloadLinksTask extends AsyncTask<Void, Void, Byte> {
@Override
protected void onPreExecute() {
if (mCallbacks != null) {
mCallbacks.onPreExecute();
}
}
@Override
protected void onPostExecute(Byte b) {
if (mCallbacks != null) {
mCallbacks.onPostExecute(b);
}
}
@Override
protected Byte doInBackground(Void... v) {
byte exceptionType = 0;
try {
linksDownloader.download();
} catch (HttpStatusException e) {
exceptionType = 1;
} catch (WrongContentException e) {
exceptionType = 2;
} catch (ConnectTimeoutException e) {
exceptionType = 3;
} catch (SocketTimeoutException e) {
exceptionType = 3;
} catch (UnknownHostException e) {
exceptionType = 3;
} catch (IOException e) {
exceptionType = 4;
} catch (Exception e) {
exceptionType = 5;
}
return exceptionType;
}
}
}