2015-11-29 13 views
1

我的應用程序有一個SQlite數據庫,我試圖在從服務器進行初始安裝時進行填充。我正在使用凌雲連接並在服務器端提供Web服務。我的問題是,在第一次安裝時,當我調用方法來填充數據庫時,它明顯在不同的線程上運行,因此在完成之前,它正在構建UI。用戶界面從數據庫中填充,因爲數據庫沒有填滿我得到錯誤。在其他代碼運行之前從網絡填充數據庫

我試圖迫使凌空調用同步運行,但只得到一個超時異常

11-29 09:38:49.646 4206-4206/com.clashtoolkit.clashtoolkit W/System.err: java.util.concurrent.TimeoutException 
11-29 09:38:49.646 4206-4206/com.clashtoolkit.clashtoolkit W/System.err:  at com.android.volley.toolbox.RequestFuture.doGet(RequestFuture.java:121) 
11-29 09:38:49.646 4206-4206/com.clashtoolkit.clashtoolkit W/System.err:  at com.android.volley.toolbox.RequestFuture.get(RequestFuture.java:97) 
11-29 09:38:49.646 4206-4206/com.clashtoolkit.clashtoolkit W/System.err:  at com.clashtoolkit.clashtoolkit.network.ArmyNetworking.getTableFromServer(ArmyNetworking.java:93) 
11-29 09:38:49.646 4206-4206/com.clashtoolkit.clashtoolkit W/System.err:  at com.clashtoolkit.clashtoolkit.database.DataCreator.getDatabaseFromServer(DataCreator.java:1657) 
11-29 09:38:49.647 4206-4206/com.clashtoolkit.clashtoolkit W/System.err:  at com.clashtoolkit.clashtoolkit.UI.ArmyBuilder.onCreate(ArmyBuilder.java:46) 
11-29 09:38:49.647 4206-4206/com.clashtoolkit.clashtoolkit W/System.err:  at android.app.Activity.performCreate(Activity.java:5990) 
11-29 09:38:49.647 4206-4206/com.clashtoolkit.clashtoolkit W/System.err:  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
11-29 09:38:49.647 4206-4206/com.clashtoolkit.clashtoolkit W/System.err:  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
11-29 09:38:49.647 4206-4206/com.clashtoolkit.clashtoolkit W/System.err:  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
11-29 09:38:49.647 4206-4206/com.clashtoolkit.clashtoolkit W/System.err:  at android.app.ActivityThread.access$800(ActivityThread.java:151) 
11-29 09:38:49.647 4206-4206/com.clashtoolkit.clashtoolkit W/System.err:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
11-29 09:38:49.647 4206-4206/com.clashtoolkit.clashtoolkit W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:102) 
11-29 09:38:49.647 4206-4206/com.clashtoolkit.clashtoolkit W/System.err:  at android.os.Looper.loop(Looper.java:135) 
11-29 09:38:49.648 4206-4206/com.clashtoolkit.clashtoolkit W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5257) 
11-29 09:38:49.648 4206-4206/com.clashtoolkit.clashtoolkit W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
11-29 09:38:49.648 4206-4206/com.clashtoolkit.clashtoolkit W/System.err:  at java.lang.reflect.Method.invoke(Method.java:372) 
11-29 09:38:49.648 4206-4206/com.clashtoolkit.clashtoolkit W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
11-29 09:38:49.648 4206-4206/com.clashtoolkit.clashtoolkit W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

我想不出來做到這一點的最好辦法。數據庫必須先填充,但我似乎無法阻止UI代碼在填充前運行。

Main.java

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_army_builder); 

    //create and populate the database 
    DataCreator dbCreate = new DataCreator(); 
    dbCreate.getDatabaseFromServer(this); 




     //creates the Toolbar and setting it as the Toolbar for the activity 
     toolbar = (Toolbar) findViewById(R.id.tool_bar); 
     setSupportActionBar(toolbar); 

     // Creating The ViewPagerAdapter and Passing Fragment Manager, Titles fot the Tabs and Number Of Tabs. 
     adapter = new TroopPagerAdapter(getSupportFragmentManager(), titles, numberOfTabs); 

     //Assigning ViewPager View and setting the adapter 
     pager = (ViewPager) findViewById(R.id.army_pager); 
     pager.setOffscreenPageLimit(4); 
     pager.setAdapter(adapter); 

     //assigning the sliding tab layout view 
     tabs = (SlidingTabLayout) findViewById(R.id.army_tabs); 
     //creating the icon portion of the sliding tabs 
     tabs.setCustomTabView(R.layout.custom_tabs, R.id.tabText); 

     //Setting custom color for the Scroll bar indicator of the Tab View 
     tabs.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() { 
      @Override 
      public int getIndicatorColor(int position) { 
       return getResources().getColor(R.color.ColorPrimaryDark); 
      } 
     }); 

     //Setting the ViewPager for the slidingtabsLayout 
     tabs.setViewPager(pager); 

     //Set the barracks fragments to the barracks viewpager 
     BuilderObjData builderObjData = new BuilderObjData(); 
     ArrayList<Builder> barracksArray = builderObjData.getBuilderObjArray(this, Utilities.BUILDER_TYPE_BARRACKS); 
     bAdpter = new BarracksPagerAdapter(getSupportFragmentManager(), barracksArray); 

     bPager = (ViewPager) findViewById(R.id.barracks_pager); 
     bPager.setAdapter(bAdpter); 
} 

getDatabaseFromServer()

public void getDatabaseFromServer(Context context) { 

    Cursor cursor = context.getContentResolver().query(Container.CONTENT_URI, null, null, null, null); 

    if (cursor == null || cursor.getCount() == 0) { 
     for (String table : DataCreator.TABLES) { 
      ArmyNetworking.getTableFromServer(table, context); 
     } 
     if (cursor != null) { 
      cursor.close(); 
     } 
    } 
} 

getTableFromServer()

public static void getTableFromServer(final String tableName, final Context context) { 
    Log.d(TAG, "called now"); 
    String url = ArmyNetworking.WEB_BASE_URL + ArmyNetworking.PATH_TABLE + "/" + tableName; 

//  RequestFuture<JSONArray> future = RequestFuture.newFuture(); 
//  JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, url, future, future); 

    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, 
      url, 
      (String) null, 
      new Response.Listener<JSONArray>() { 
       @Override 
       public void onResponse(JSONArray response) { 
        updateTableFromServer(response, context, tableName); 
        Log.d(TAG, "got response"); 
       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      //add error handling 
     } 
    }); 

    VolleySingleton.getInstance(context).addToRequestQueue(jsonArrayRequest); 

//  try { 
//   JSONArray response = future.get(30, TimeUnit.SECONDS); 
//   updateTableFromServer(response, context, tableName); 
// 
//  } catch (InterruptedException | ExecutionException | TimeoutException e) { 
//   e.printStackTrace(); 
//  } 
} 

上述方法示出了兩種不同的方法我試圖使截擊呼叫。註釋掉的代碼,迫使它是同步

回答

2

就在你的程序,它顯示一個進度條,並像「請稍候,數據從網絡下載或查看文本開始添加其他活動我們競爭對手的應用程序「。

+0

如何確定數據庫進程已完成,以便我可以切換到主要活動? –

+0

閱讀[文檔](http://developer.android.com/training/multiple-threads/communicate-ui.html)。 –