2013-08-26 4 views
0

Im은 Fragment의 AsyncTask에서 this 문서에 설명 된 html 페이지를 다운로드하고 구문 분석하는 방법을 사용합니다. 에뮬레이터에서는 모든 것이 잘 작동하지만 내 갤럭시 S2에서 시도했습니다. 내 장치를 돌리면 목록보기가 새로 고쳐지지 않으며 장치를 다시 돌리면 새로 고쳐집니다. 여기 AsyncTask in Fragment

내가에서 onCreate 내 조각을 사용하는 방법의 코드 (LinksDownloader - HTML 구문 분석 클래스) 당신은 그것을 위해 콜백 인터페이스를 만들 수 있습니다

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

} 

답변

2

귀하의 구현이 -at 이내로 할 논란의 잘못이 아니라면입니다 도움이됩니다.

당신이하려는 것은 데이터를 다운로드하는 역할 만하는 조각을 만드는 것입니다.

귀하의 사례 목록보기에서 UI 처리 부분을이 단편 (ListFragment가 적절할 것으로)으로 이동해야합니다. 더 좋은 방법은 AsyncTaskLoader 구현을 작성하고 LoaderCallback을 Fragment에 추가하는 것입니다.이 방법은 화면 회전과 자신의 인터페이스 및/또는 처리기 작성에 대한 걱정을 없애줍니다.

1

FragmentManager fm = getSupportFragmentManager(); 
mTaskFragment = (DownloadLinksTaskFragment) fm.findFragmentByTag("task"); 
if (mTaskFragment == null){ 
    mTaskFragment = new DownloadLinksTaskFragment(); 
    mTaskFragment.linksDownloader = new LinksDownloader(); 
    fm.beginTransaction().add(mTaskFragment, "task").commit(); 
} 
... 
goButton.setOnClickListener(new Button.OnClickListener() { 
    public void onClick(View v) { 
     mTaskFragment.execute(); 
    } 
}); 
... 
linksAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, mTaskFragment.linksDownloader.linksArray); 
linksListView.setAdapter(linksAdapter); 

그리고 조각 수업을하고 그것을 활동에 구현하십시오. 조각에 해당 인터페이스에 대한 참조를 만들고 onPostExecute()의 인터페이스가 단편 인 getActivity()으로 캐스팅하십시오. 목록보기 내용을 새로 고치려면 linksAdapter.notifyDataSetChanged() 활동 호출에서 해당 인터페이스의 재정의 된 메소드에서.

희망이