2016-09-12 6 views
0

SplashアクティビティにAsyncTaskを追加しようとしています - AsyncTask doInBackground()はFirebaseからDB情報(JSON)をダウンロードし、DBを更新します。AsyncTaskとUpdating DBを使用するとUIがフリーズする

データが更新され、スプラッシュアクティビティが次のアクティビティに進むまで、ProgressDialogを使用しようとしています。私がonPostExecute()で却下した場合、ProgressDialogは表示されません。

私はdismiss()アクションを削除すると表示されますが、ProgressDialogがフリーズしていることがわかります。明らかに、私のコードでは何かが正しくありません。

私はAndroid開発で非常に新しいです。助けてください。

付属コード:

public class NationalSplashActivity2 extends Activity { 

NationalDatabaseHelper NationalDB; 
xDatabaseHelper xDB; 
Cursor cursor; 
String default_league; 
private ProgressDialog mProgressDialog; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.national_activity_splash); 

    final ImageView iv = (ImageView) findViewById(R.id.nationalimageViewSplashScreen); 

    BackgroundTask backgroundtask = new BackgroundTask(NationalSplashActivity2.this); 
    backgroundtask.execute(); 

    Thread startTimer = new Thread(){ 
    public void run(){ 

      sleep(2000); 
    }catch (InterruptedException e){ 
      e.printStackTrace(); 
     } 

    }; 
    startTimer.start(); 
} 

class BackgroundTask extends AsyncTask<String,String,String> { 

    Context ctx; 
    NationalDatabaseHelper NationalDB; 
    xDatabaseHelper SecDB; 



    BackgroundTask (Context ctx){ 

     this.ctx = ctx; 
     mProgressDialog = new ProgressDialog(ctx); 
     mProgressDialog.setMessage("Loading..."); 
     mProgressDialog.setIndeterminate(false); 
     mProgressDialog.setMax(100); 
     mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     mProgressDialog.setCancelable(true); 

    } 

    @Override 
    protected void onPreExecute() { 
     //super.onPreExecute(); 
     mProgressDialog.show(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 

     NationalAllGamesUpdate(); 
     xAllGamesUpdate(); 

     return ""; 
    } 

    @Override 
    protected void onProgressUpdate(String... progress) { 

     super.onProgressUpdate(progress); 

     mProgressDialog.setProgress(Integer.parseInt(progress[0])); 

    } 

    @Override 
    protected void onPostExecute(String result) { 

     if (mProgressDialog.isShowing()) { 
      mProgressDialog.dismiss(); 
     } 

} 


} 

答えて

0

ここで何をしているがverry奇妙な..ですデフォルトでは、firebaseからデータを取り出すことはasychronuous操作であるので、あなたは非同期を作成する必要はありません。データをダウンロードし、データベースに保存してから新しいアクティビティを開始してください。私が見ることができるように、非同期を作成してデータを取得し、データベースに保存し、スリープで新しいスレッドを開始し、データベースを相互に照会してから、新しいアクティビティを開始します。

retievingプロセスとデータベースの保存が完了していて、スリープ時間が経過してデータベースにアクセスしようとしているときに、プロセスを保存してデータベースをロックするか、まだ完成してない。データベースの保存プロセスが完了した直後にアクティビティを開始することができます。また、firebaseレスポンスのデータを使用してそのデータを使用することもできます。より多くの時間とメモリを節約できます。検索プロセスが開始されたときに進行状況ダイアログが表示され、メモリリークを防ぐために新しいアクティビティを開始する直前に却下する必要があります。

編集:あなたの質問を編集したようです。再び

編集:

だからあなたは種類のデータベースヘルパーのコンストラクタに渡すことができインターフェース、作成することができます。

new NationalDatabaseHelper(new MyCustomInterface() {}) MyCustomInterface一つの方法またはそれ以上を持つことができ、あなたは通知したいのかによって決まります。私はメソッドvoid onTaskCompleted()を持つことができますか、挿入/削除または更新メソッドの後にこれらの操作がシンクロノーズなので、あなたが呼び出す方法はlistener.onTaskCompleted()であり、どこで行うべきかを呼び出す必要があります次。あなたが完了したものをデータベース操作を知っているので、私はrecomandこと

他の方法で、この場合、

NationalDatabaseHelper.addEntry(new MyCustomInterface(){});

の種類は、より便利です。

あなたは何でもでき、あなたにとって最適です。あなたが理解したいと思っています。

+0

firebaseからデータを取得し、firebaseの新しいデータで自分のDBを更新します。 asynctaskは両方のためのものです - 特にdb更新操作には時間がかかります(3〜4秒)。この操作はうまくいきます。 asynctaskでデータを疲労させながら私のスプラッシュスクリーンを維持することができますか? – Smoker09

+0

データがデータベースに挿入された後にスプラッシュ画面を終了することができます。あなたの挿入は同期的か非同期的でしたか?もし同期があれば、コード行を挿入した後で新しいアクティビティを開始してください。そうでない場合は、カスタムインターフェイスを使用して処理が完了したときに通知することができます。 –

+0

どうすればそのシンクロナスなのか分かりますか?どのように私はそれのためのカスタムインターフェイスを使用するのですか? yooさんは、例または前に質問された質問を提供していただけますか?ありがとう! – Smoker09

関連する問題