2016-07-04 11 views
0

こんにちは、これは初心者ですが、プログレスバーを使ってフラグメントにasynctaskを使用するのが本当に苦労しています。特に入れ子になったフラグメントを使用しているので、setretaininstance (真)、私はこれが動作しているようですasynctaskをフラグメントに使用してプログレスバー付きのデータベースをロードする

public class OneFragment extends fragment { 
private WeakReference<MyAsyncTask> asyncTaskWeakRef; 
} 

private void startNewAsyncTask() { 
    MyAsyncTask asyncTask = new MyAsyncTask(this); 
    this.asyncTaskWeakRef = new WeakReference<MyAsyncTask >(asyncTask); 
    asyncTask.execute(); 
} 

public void showProgressBar() { 
    ProgressBar progress = (ProgressBar)getActivity().findViewById(R.id.progressBarFetch); 
    progress.setVisibility(View.VISIBLE); 
    progress.setIndeterminate(true); 
} 

public void hideProgressBar() { 
    ProgressBar progress = (ProgressBar)getActivity().findViewById(R.id.progressBarFetch); 
    progress.setVisibility(View.GONE); 

} 

private class MyAsyncTask extends AsyncTask<Void, Void, Void> { 

    private WeakReference<OneFragment> fragmentWeakRef; 

    private MyAsyncTask (OneFragment fragment) { 
     this.fragmentWeakRef = new WeakReference<OneFragment>(fragment); 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     showProgressBar(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(getActivity(), "ADD_NEW_CARD", null); 
     SQLiteDatabase db = helper.getWritableDatabase(); 
     DaoMaster daoMaster = new DaoMaster(db); 
     DaoSession daoSession = daoMaster.newSession(); 
     addNewCardDao leaseDao = daoSession.getAddNewCardDao(); 
     QueryBuilder qb = leaseDao.queryBuilder(); 
     SharedPreferences sharedPreferences = PreferenceManager 
       .getDefaultSharedPreferences(getActivity()); 
     // Create a new boolean and preference and set it to true 
     prefString = sharedPreferences.getString("ICONS SELECTED","ORIGINAL"); 
     switch (prefString){ 
      case "ORIGINAL": 

       leaseList.clear(); 
       String[] strings1 = {"ORIGINAL", "USER"}; 
       qb.where(addNewCardDao.Properties.CardIconType.in(strings1), 
         qb.and(addNewCardDao.Properties.Type_of_type.eq("PEOPLE"), 
           addNewCardDao.Properties.Type_of_word.eq("NOUNS"))); 
       leaseList = qb.list(); 
       db.close(); 
       break; 
      case "SIMPLE": 
       leaseList.clear(); 
       String[] strings2 = {"SIMPLE", "USER"}; 
       qb.where(addNewCardDao.Properties.CardIconType.in(strings2), 
         qb.and(addNewCardDao.Properties.Type_of_type.eq("PEOPLE"), 
           addNewCardDao.Properties.Type_of_word.eq("NOUNS"))); 
       leaseList = qb.list(); 
       db.close(); 
       break; 
      case "PHOTOS": 
       leaseList.clear(); 
       String[] strings3 = {"PHOTOS", "USER"}; 
       qb.where(addNewCardDao.Properties.CardIconType.in(strings3), 
         qb.and(addNewCardDao.Properties.Type_of_type.eq("PEOPLE"), 
           addNewCardDao.Properties.Type_of_word.eq("NOUNS"))); 
       leaseList = qb.list(); 
       db.close(); 
       break; 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void response) { 
     super.onPostExecute(response); 
     if (this.fragmentWeakRef.get() != null) { 
      hideProgressBar(); 
      CardAdapterDB cardAdapterDB = new CardAdapterDB(leaseList); 
      recyclerView.setAdapter(cardAdapterDB); 
      cardAdapterDB.notifyDataSetChanged(); 
     } 
    } 
} 

下の私のアプローチになったが、プログレスバーのnullポインタエラーで回転クラッシュに私は(プログレスバーが表示さgetActivityを見つける変更しようとしたthis簡単なチュートリアル、次の試してみました)私のビューをどのように膨らませるので、rootViewを呼び出す

View rootView = inflater.inflate(R.layout.fragment_one, container, false); 

が、それはフラグメントが添付された後にのみ、それを参照しようとしているアプリが起動する前に、NULLポインタが、今回再びクラッシュし、私は間違いなく私のレイアウトで、このプログレスバーを持って

<ProgressBar 
android:id="@+id/progressBarFetch" 
style="?android:attr/progressBarStyleLarge" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:indeterminate="true" /> 

とイムこのdoesntの仕事私は、 私は多くのすべてのこの変更を必要とするすべての同じレイアウトを使用してすべての同じデータベースから別のクエリを使用してロードするフラグメントがあるので、非同期と進行状況バーの静的メソッドを作ることをお勧めしますか各フラグメントと、どのように入れ子になったフラグメントの向きを扱うことができますか?

誰でも私はこれで正しい方向に向いていると指摘するか、または何か不足しているものを指摘することがあります。

答えて

1

これに最も適切な方法は、非同期タスクのインスタンスを回転で保持するためです。

ここには、非常に簡単なexampleへのリンクがあり、この手法をアプリに統合するのが簡単です。

+0

あなたよりも素晴らしいブログ投稿です。一度笑ったけど、周りを見回すと、これは本当に助けになると思います。 –

+0

あなたはウェルカムです。 – Stanojkovic

関連する問題