Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在运行其他代码之前从网络填充数据库_Java_Android_Sqlite_Android Volley - Fatal编程技术网

Java 在运行其他代码之前从网络填充数据库

Java 在运行其他代码之前从网络填充数据库,java,android,sqlite,android-volley,Java,Android,Sqlite,Android Volley,我的应用程序有一个SQlite数据库,我正在尝试从服务器初始安装时填充该数据库。我正在使用volley进行连接,并且在服务器端有一个web服务。我的问题是,在第一次安装时,当我调用该方法填充数据库时,它显然是在另一个线程上运行的,所以在完成之前,它正在构建UI。用户界面是从数据库填充的,因此,由于数据库尚未填充,因此出现错误 我试图强制截击调用同步运行,但只是得到一个超时异常 11-29 09:38:49.646 4206-4206/com.clashtoolkit.clashtoolkit W

我的应用程序有一个SQlite数据库,我正在尝试从服务器初始安装时填充该数据库。我正在使用volley进行连接,并且在服务器端有一个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)
我想不出最好的办法。必须首先填充DB,但在填充之前,我似乎无法阻止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);
}
getTableFromServer()

publicstaticvoid getTableFromServer(最终字符串表名,最终上下文){
Log.d(标记“立即调用”);
字符串url=ArmyNetworking.WEB\u BASE\u url+ArmyNetworking.PATH\u TABLE+“/”+tableName;
//RequestFuture=RequestFuture.newFuture();
//JsonArrayRequest JsonArrayRequest=新的JsonArrayRequest(Request.Method.GET,url,future,future);
JsonArrayRequest JsonArrayRequest=新的JsonArrayRequest(Request.Method.GET,
网址,
(字符串)null,
新的Response.Listener(){
@凌驾
公共void onResponse(JSONArray响应){
updateTableFromServer(响应、上下文、表名);
Log.d(标记“got response”);
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
//添加错误处理
}
});
getInstance(上下文).addToRequestQueue(jsonArrayRequest);
//试一试{
//JSONArray response=future.get(30,TimeUnit.SECONDS);
//updateTableFromServer(响应、上下文、表名);
//
//}catch(InterruptedException | ExecutionException | TimeoutException e){
//e.printStackTrace();
//        }
}

上面的方法显示了我尝试发出截击呼叫的两种不同方式。注释掉的代码是强制同步的

只需在程序开始时添加另一个活动,它会显示一个进度条和一个文本,如“请稍候,数据从网络加载,或者同时查看我们竞争对手的应用程序”.

如何确定数据库进程已完成,以便切换到主活动?请阅读。
 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();
        }
    }
}
 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();
//        }
}