Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 分段异步任务_Android_Android Fragments_Android Asynctask - Fatal编程技术网

Android 分段异步任务

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

Im使用文章中描述的方法,在Fragment的异步任务中下载和解析html页面。在emulator上一切正常,但后来我在Galaxy S2上试用了它。当我旋转我的设备时,listview不会被刷新,如果我将设备旋转回来,它会被刷新

下面是我如何在onCreate(LinksDownloader-用于解析html的类)中使用片段的代码

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;
    }
}

}