2017-12-15 10 views
2

TextViewProgressBarを表示する画面を作成しました。 ProgressBarはにGSONを使用してデータベースの作成と1000 ++データの追加を表します。これを達成するために、私は、3つの異なるファイル、LocalDBHelper(私のデシベルセットアップある)、GSONHandlerSQLiteに私JSONファイルを変換)とロード(私のAsyncTask)を作成しました。複数のテーブルにデータの行を追加するときにAsyncTaskを実装する

私の問題は、私のProgressBarは静的であり、データの追加の進捗状況が表示されませんでした。私はアンドロイド開発に慣れていないし、自分のコードを進めるにあたっては無知だ。

MainActivity.java

public class MainActivity extends AppCompatActivity implements Loading.LoadingTaskFinishedListener { 

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

     LocalDBHelper mydb = LocalDBHelper.newInstance(this); 
     //check if db exist, delete db if exist 
      if (doesDatabaseExist(mydb.getDatabaseName())) 
       this.deleteDatabase(mydb.getDatabaseName()); 

     ProgressBar progressBar = findViewById(R.id.progressBar); 
      new Loading(progressBar, this, this).execute(""); 

     } 

     @Override 
     public void onTaskFinished() { 
     finish(); 
     } 

     public boolean doesDatabaseExist(String databaseName) { 
      File dbFile = this.getDatabasePath(databaseName); 
      return dbFile.exists(); 
     } 
} 

Loading.java

public class Loading extends AsyncTask<String, Integer, Integer> { 

    public interface LoadingTaskFinishedListener { 
     void onTaskFinished(); 
    } 

    private LocalDBHelper mydb = null; 

    private final ProgressBar progressBar; 
    private Context mContext; 
    private final LoadingTaskFinishedListener finishedListener; 

    public Loading(ProgressBar progressBar, LoadingTaskFinishedListener finishedListener, Context context) { 
     this.progressBar = progressBar; 
     this.finishedListener = finishedListener; 
     this.mydb = LocalDBHelper.newInstance(context); 
     mContext = context; 

    } 

    @Override 
    protected Integer doInBackground(String... params) { 
     SQLiteDatabase sqLiteDatabase = mydb.getWritableDatabase(); 
     GSONHandler.newInstance(mContext, sqLiteDatabase); 

     return 1234; 

    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 
     progressBar.setProgress(values[0]); 
    } 

    @Override 
    protected void onPostExecute(Integer result) { 
     super.onPostExecute(result); 
     finishedListener.onTaskFinished(); 
    } 
} 

GSONHandler.java

public class GSONHandler { 

    static final String TAG = GSONHandler.class.getSimpleName(); 

    private Context context; 
    private LocalDBHelper mydb; 
    private SQLiteDatabase sqLiteDatabase; 

    private static GSONHandler mGsonHandler = null; 

    public static GSONHandler newInstance(Context context, SQLiteDatabase sqLiteDatabase){ 
     if (mGsonHandler == null){ 
      mGsonHandler = new GSONHandler(context.getApplicationContext(), sqLiteDatabase); 
     } 
     return mGsonHandler; 
    } 

    private GSONHandler(Context context, SQLiteDatabase sqLiteDatabase) { 
     this.context = context; 
     this.sqLiteDatabase = sqLiteDatabase; 

     onCreate(); 
    } 

    //assign json data to tables 
    private void onCreate() { 

     //get local json and save it to db 
     premiseCategoryMasterSetup(); 
     premiseCategorySetup(); 
     inspcTypeSetup(); 
     inspcStatusSetup(); 
     stateSetup(); 
     areaSetup(); 
     districtSetup(); 
     analysisGroupSetup(); 
     analysisSubGroup(); 
     parameterSetup(); 
     subParameterSetup(); 
     identificationSetup(); 
     premiseCertliSetup(); 
     txn_premiseSetup(); 
     prosecutionOtherSetup(); 
     txn_layoutSectionSetup(); 
     txn_layoutCardSetup(); 
     txn_layoutInputFieldSetup(); 
    } 

    private void areaSetup() { 
     Log.d(TAG, "areaSetup"); 
     InputStream inputStream = context.getResources().openRawResource(R.raw.ref_area); 
     String jsonString = readJsonFile(inputStream); 

     Gson gson = new Gson(); 
     List<Area> areaList = Arrays.asList(gson.fromJson(jsonString, Area[].class)); 

     for (Area area : areaList) 
     { 
      if(sqLiteDatabase != null) { 
       ContentValues values = new ContentValues(); 
       values.put(Constants.COLUMN_AREA_ID, area.getAreaId()); 
       values.put(Constants.COLUMN_AREA_CODE, area.getAreaCode()); 
       values.put(Constants.COLUMN_AREA_NAME, area.getAreaName()); 
       values.put(Constants.COLUMN_ACTIVE, area.getActive()); 
       values.put(Constants.COLUMN_FK_STATE_ID, area.getFk_stateId()); 

       long id = sqLiteDatabase.insertOrThrow(Constants.REF_AREA_TABLE, 
         null, values); 
      } 
     } 

    } 

    .... 

    private String readJsonFile(InputStream inputStream) { 
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
     byte bufferByte[] = new byte[1024]; 
     int length; 

     try { 
      while ((length = inputStream.read(bufferByte)) != -1) { 
       outputStream.write(bufferByte, 0 , length); 
      } 
      outputStream.close(); 
      inputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return outputStream.toString(); 
    } 

} 
+0

ProgressBarの代わりにProgress Dialogを使用してください:) –

+0

進捗ダイアログは廃止されましたか?代わりにプログレスバーを使用するように提案されましたか? @SubhashPrajapati –

答えて

2

あなたはSEです進捗バーの進捗状況をonProgressUpdateメソッド内に記録しますが、呼び出されることはありません。 onProgressUpdateメソッドに電話するには、doInBackgroundメソッドの中でpublishProgressメソッドを呼び出す必要があります。 publishProgressメソッドの呼び出し後に、UIスレッドでonProgressUpdateメソッドが呼び出されます。

+0

あなたはコードの例を共有することができますか?私はそれを追加しようとすると、混乱していると言った 'ArrayIndexOutOfBoundsException:length = 0;インデックス= 0である。どのようにしてテーブルのすべてのデータを追加するのが進んでいますか? –

0

doInBackground()publishProgress();を表示し、プログレスバーを更新する方法。これが助けてくれることを願います。

+0

バックグラウンドでpublishPorgressを追加しようとしましたが、** onProgressUpdate()**内の 'value [0]'は 'ava.lang.ArrayIndexOutOfBoundsException:length = 0;を投げています。 index = 0'となり、progressBarはまだ動きません。それは100%に保つ –

関連する問題