2017-06-02 14 views
0

背景情報: アクティビティ> ParentFragment(ViewPagerを保持する)>子フラグメントを使用しています。 子フラグメントは、追加、削除ボタンで動的に追加されます。 私はMVPアーキテクチャを使用していますAsyncTaskLoaderがオリエンテーション変更後にonFinishedLoadを呼び出さない

実際の問題: 子フラグメントでは、asynctaskloaderを使用してプレゼンターから読み込まれるlistviewがあります。

子供フラグメント:我々は持っているプレゼンタークラスで

//Initialize Views 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    root = inflater.inflate(R.layout.fragment_search_view_child, container, false); 

....... 

    mSearchViewPresenter= new SearchViewPresenter(
      getActivity(), 
      new GoogleSuggestLoader(getContext()), 
      getActivity().getLoaderManager(), 
      this, id 
    ); 

    SearchList list=new SearchList(); 
    //requestList from presenter 
    searchListAdapter =new SearchViewListAdapter(getActivity(), list, this); 
    listView.setAdapter(searchListAdapter); 

...... 

    return root; 
} 



@Override 
public void onResume(){ 
super.onResume(); 
    mSearchViewPresenter.start(); 
    searchBar.addTextChangedListener(textWatcher); 


} 

public SearchViewPresenter(@NonNull Context context, @NonNull GoogleSuggestLoader googleloader,@NonNull LoaderManager loaderManager, 
           @NonNull SearchViewContract.View tasksView, @NonNull String id) { 
     // mLoader = checkNotNull(loader, "loader cannot be null!"); 
     mLoaderManager = checkNotNull(loaderManager, "loader manager cannot be null"); 
     // mTasksRepository = checkNotNull(tasksRepository, "tasksRepository cannot be null"); 
     mSearchView = checkNotNull(tasksView, "tasksView cannot be null!"); 

     mSearchView.setPresenter(this); 

     searchList=new SearchList(); 
     this.googleLoader=googleloader; 
     this.context=context; 
     this.id=loaderID; 
     // this.id=Integer.parseInt(id); 
    } 

    @Override 
    public void start() { 


     Log.d("start>initloader","log"); 
     mLoaderManager.restartLoader(1, null, this); 
    } 

    //TODO implement these when you are ready to use loader to cache local browsing history 


    @Override 
    public android.content.Loader<List<String>> onCreateLoader(int i, Bundle bundle) { 

     int loaderid=googleLoader.getId(); 
     Log.d("Loader: ", "created"); 
     googleLoader=new GoogleSuggestLoader(context); 
     googleLoader.setUrl(""); 
     googleLoader.setUrl(mSearchView.provideTextQuery()); 
     return googleLoader; 
    } 

    @Override 
    public void onLoadFinished(android.content.Loader<List<String>> loader, List<String> data) { 
     Log.d("Loader: ", "loadFinished"); 
     searchList.clear(); 
     for (int i = 0; i < data.size(); ++i) { 

      searchList.addListItem(data.get(i), null, LIST_TYPE_SEARCH, android.R.drawable.btn_plus); 
      Log.d("data Entry: ",i+ " is: "+searchList.getText(i)); 
     } 
     mSearchView.updateSearchList(searchList); 

    } 

    @Override 
    public void onLoaderReset(android.content.Loader<List<String>> loader) { 

    } 

また、我々は、編集中のフラグメントビュー上のEditTextボックスによってトリガされたプレゼンターにこのコードを持っています。

@Override 
     public void notifyTextEntry() { 
      //DETERMINE HOW TO GIVE LIST HERE 
      // Dummy List 
      Log.d("notifyTextEntry","log"); 
      if(googleLoader==null)googleLoader=new GoogleSuggestLoader(context); 
       googleLoader.setUrl(mSearchView.provideTextQuery()); 
      // mLoaderManager.getLoader(id).abandon(); 


      mLoaderManager.getLoader(1).forceLoad(); 
      mLoaderManager.getLoader(1).onContentChanged(); 
      Log.d("length ", searchList.length().toString()); 
     // googleLoader.onContentChanged(); 
     } 

最後に、私たちはここにローダーを持っている:

public class GoogleSuggestLoader extends AsyncTaskLoader<List<String>>{ 

    /** Query URL */ 
    private String mUrl; 
    private static final String BASE_URL="https://suggestqueries.google.com/complete/search?client=firefox&oe=utf-8&q="; 
    private List<String> suggestions =new ArrayList<>(); 


    public GoogleSuggestLoader(Context context) { 
     super(context); 
     this.mUrl=BASE_URL; 

    } 

    public void setUrl(String mUrl){ 
     this.mUrl=BASE_URL+mUrl; 
    }; 
    @Override 
    protected void onStartLoading() {forceLoad(); } 
    @Override 
    public List<String> loadInBackground() { 
     if (mUrl == null) { 
      return null; 
     } 

     try { 
      suggestions = new ArrayList<>(); 
      Log.d("notifyinsideLoader","log"); 
      String result=GoogleSuggestParser.parseTemp(mUrl); 
      if(result!=null) { 
       JSONArray json = new JSONArray(result); 
       if (json != null) { 
       JSONArray inner=new JSONArray((json.getString(1))); 
        if(inner!=null){ 
         for (int i = 0; i < inner.length(); ++i) { 
          //only show 3 results 
          if(i==3)break; 
          Log.d("notifyinsideLoader",inner.getString(i)); 
          suggestions.add(inner.getString(i)); 
         } 

        } 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return suggestions; 
    } 





} 

ので問題:

コードがフラグメント上のリストビューへのデータの罰金をロードします。オリエンテーションが変更されると、ローダーはonLoadFinishedを呼び出しません。私はローダーをテストし、それはデータを細かく処理しています。 私はすでにforceloadとonContentChangedをプレゼンターで無駄に試みました。 もう少し情報が必要な場合や、RxJavaのようなものを私に教えてください。しかし、私は本当にこれを働かせたいです。 質問する前に私は同じような問題を見た:AsyncTaskLoader: onLoadFinished not called after orientation changeしかし、私はこの問題が存在しないように同じIDを使用しています。

+0

[この回答を参照](https://stackoverflow.com/a/16525445/1496693)あなたのアクティビティは再作成されていますが、あなたのローダーは再作成されていません。 – airowe

+0

ローダーが再作成されるべきか、ローダIDでなければ古いローダーにアクセスすることができますか? –

答えて

0

このページには回答がありましたAsyncTaskLoader doesn't call onLoadFinished これに移動する方法については詳細は記載されていません。 今後、この問題を抱える人はここで説明します。

サポートライブラリはフラグメント用です。したがって、コールバックを担当するクラスは、サポートライブラリから正しいメソッドをインポートして実装する必要があります。 MVPを使用している場合と同じですが、プレゼンターはsupport loadermanagerから拡張する必要があります。 ie:import android.support.v4.app.LoaderManager;正しいコールバックを実装します。

第二

@Override 
    public android.support.v4.content.Loader<List<String>> onCreateLoader(int i, Bundle bundle) { 
... 
return new loader 
} 

@Override 
    public void onLoadFinished(android.support.v4.content.Loader<List<String>> loader, List<String> data) { 
//do something here to your UI with data 
} 

同様:ローダ自体が asynctaskloader支持から延在しなければなりません。 ie:import android.support.v4.content.AsyncTaskLoader;

関連する問題