Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.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 来自本地数据存储的Android解析查询太慢_Java_Android_Parse Platform_Saving Data - Fatal编程技术网

Java 来自本地数据存储的Android解析查询太慢

Java 来自本地数据存储的Android解析查询太慢,java,android,parse-platform,saving-data,Java,Android,Parse Platform,Saving Data,在我的主要活动中,我用字符串数组填充recyclerview;但是,我从我的解析数据库中获取这些字符串 我现在知道,当您查询信息时,该方法是异步的,这意味着它在后台运行,等待从数据库接收响应,同时代码继续运行。我遇到了这样一个问题:用字符串填充数组花费的时间太长,并且recycerview已经被填充(因为数组还没有被填充,所以使用空值) 因此,我决定使用parse在本地保存数据,并使用数据库备份信息。我的问题仍然是,这太慢了,无法为recyclerview填充我的适配器。我甚至确保它没有查询数据

在我的主要活动中,我用字符串数组填充recyclerview;但是,我从我的解析数据库中获取这些字符串

我现在知道,当您查询信息时,该方法是异步的,这意味着它在后台运行,等待从数据库接收响应,同时代码继续运行。我遇到了这样一个问题:用字符串填充数组花费的时间太长,并且recycerview已经被填充(因为数组还没有被填充,所以使用空值)

因此,我决定使用parse在本地保存数据,并使用数据库备份信息。我的问题仍然是,这太慢了,无法为recyclerview填充我的适配器。我甚至确保它没有查询数据库,并将我的数据和互联网连接转到我正在测试的手机上。这是同一个故事

是否有人知道一种优化的方法来检索数据,以便它足够快地填充recyclerview,因为现在获取字符串需要整整3秒钟。我不想暂停我的程序3秒钟,只是为了等待解析完成它的工作

下面是我如何保存数据的

// get current user
ParseObject studentClasses = new ParseObject("StudentClasses");

// register their periods into database
studentClasses.put("student_id", ParseUser.getCurrentUser());
studentClasses.put("first_period", ClassSelected_Period[PERIOD1]);
studentClasses.put("second_period", ClassSelected_Period[PERIOD2]);
studentClasses.put("third_period", ClassSelected_Period[PERIOD3]);
studentClasses.put("fourth_period", ClassSelected_Period[PERIOD4]);
studentClasses.put("fifth_period", ClassSelected_Period[PERIOD5]);
studentClasses.put("sixth_period", ClassSelected_Period[PERIOD6]);
studentClasses.put("seventh_period", ClassSelected_Period[PERIOD7]);

// save the information locally and in database
studentClasses.pinInBackground();

// navigate user home
navigateToHome();
下面是我如何检索主要活动中的数据

// query database for user's classes
ParseQuery<ParseObject> query = ParseQuery.getQuery("StudentClasses");
query.fromLocalDatastore().whereEqualTo("student_id", ParseUser.getCurrentUser());

// find it, first looking at local data store then going to database
query.getFirstInBackground(new GetCallback<ParseObject>()
{
    @Override
    public void done (ParseObject parseObject, ParseException e)
    {
        if (e == null)
        {
            // retrieved the object
            userClasses[PERIOD1] = parseObject.getString("first_period");
            userClasses[PERIOD2] = parseObject.getString("second_period");
            userClasses[PERIOD3] = parseObject.getString("third_period");
            userClasses[PERIOD4] = parseObject.getString("fourth_period");
            userClasses[PERIOD5] = parseObject.getString("fifth_period");
            userClasses[PERIOD6] = parseObject.getString("sixth_period");
            userClasses[PERIOD7] = parseObject.getString("seventh_period");

            // DEBUG: shows how long it takes for method to return
            Toast.makeText(getApplicationContext(),"during call = " + userClasses[PERIOD1], Toast.LENGTH_LONG).show();
        }
        else
        {
            // DEBUG: shows if exception happened
            Toast.makeText(getApplicationContext(),"Exception Thrown" ,Toast.LENGTH_SHORT).show();
        }
    }
});

// DEBUG: shows how long it takes for code to reach this point
Toast.makeText(getApplicationContext(),"after call = " + userClasses[PERIOD1], Toast.LENGTH_LONG).show();
    package maxbleggi.afstudentplanner;

import ... 

public class MainActivity extends AppCompatActivity
{
    // "MACROS" for user's class periods
    private final int PERIOD1 = 0;
    private final int PERIOD2 = 1;
    private final int PERIOD3 = 2;
    private final int PERIOD4 = 3;
    private final int PERIOD5 = 4;
    private final int PERIOD6 = 5;
    private final int PERIOD7 = 6;

    // toolbar
    private Toolbar toolbar;

    // navigation drawer
    private DrawerLayout navDrawer;

    // user's data
     public String[] userClasses = new String[10];

    // list to fill Classroom class with
    private List<ClassroomClass> classrooms;

    /*
    * on creation of activity
     */
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // initialise and set toolbar as actionbar
        toolbar = (Toolbar) findViewById(R.id.tool_bar);
        setSupportActionBar(toolbar);

        // initialize nav bars
        initNavBars();

        // initialize drawer layout
        NavigationView navView = (NavigationView) findViewById(R.id.navigation_view);

        // initialize nav drawer
        navDrawer = (DrawerLayout) findViewById(R.id.drawer);
        initNavDrawer(navDrawer);

        // initialize layout manager for recycler view
        RecyclerView.LayoutManager mainLayoutManager = new LinearLayoutManager(this);

        // initialize data for all classes before setting adapter
        initClassData();

        // set the adapter for recycler view
        RecyclerView.Adapter mainAdapter = new MainRecyclerAdapter(classrooms);

        // initialize recycler view elements
        RecyclerView mainRecyclerView = (RecyclerView) findViewById(R.id.main_recycler_view);

        // add layout manager to recycler view
        mainRecyclerView.setLayoutManager(mainLayoutManager);

        // add adapter to recycler view
        mainRecyclerView.setAdapter(mainAdapter);
    }

    /*
    * initializes the class data for each class
    */
    public void initClassData()
    {
        // check if a user is not cached
        ParseUser currentUser = ParseUser.getCurrentUser();
        if (currentUser == null)
        {
            // prompt user to Register screen
            // create intent to start activity
            Intent intent = new Intent(MainActivity.this, RegisterActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

            // start new activity
            startActivity(intent);

            // stop current activity
            finish();
        }

        // query database for user's classes
        ParseQuery<ParseObject> query = ParseQuery.getQuery("StudentClasses");
        query.fromLocalDatastore().whereEqualTo("student_id", ParseUser.getCurrentUser());

        // find it, first looking at local data store then going to database
        query.getFirstInBackground(new GetCallback<ParseObject>()
        {
            @Override
            public void done (ParseObject parseObject, ParseException e)
            {
                if (e == null)
                {
                    // retrieved the object
                    userClasses[PERIOD1] = parseObject.getString("first_period");
                    userClasses[PERIOD2] = parseObject.getString("second_period");
                    userClasses[PERIOD3] = parseObject.getString("third_period");
                    userClasses[PERIOD4] = parseObject.getString("fourth_period");
                    userClasses[PERIOD5] = parseObject.getString("fifth_period");
                    userClasses[PERIOD6] = parseObject.getString("sixth_period");
                    userClasses[PERIOD7] = parseObject.getString("seventh_period");

                    // DEBUG: shows how long it takes for method to return
                    Toast.makeText(getApplicationContext(),"during call = " + userClasses[PERIOD1], Toast.LENGTH_LONG).show();
                }
                else
                {
                    // DEBUG: shows if exception happened
                    Toast.makeText(getApplicationContext(),"Exception Thrown" ,Toast.LENGTH_SHORT).show();
                }
            }
        });

        // DEBUG: shows how long it takes for code to reach this point
        Toast.makeText(getApplicationContext(),"after call = " + userClasses[PERIOD1], Toast.LENGTH_LONG).show();

        // fill all fields for class periods
        classrooms = new ArrayList<>();

        // titles of classes to add to list
        String[] classTitles = {"First Period", "Second Period", "Third Period", "Fourth Period",
                "Fifth Period", "Sixth Period", "Seventh Period"};

            // iterate over every period to add it to the list
            for (int i = 0; i <= PERIOD7; i++)
            {
                // if there was a class registered for that period
                if (userClasses[PERIOD3] != null)
                {
                    // add it to the class to be added to recycler view
                    classrooms.add(new ClassroomClass(userClasses[i], classTitles[i], i + 1));
                }
            }

    }

    /*
    * initialize navigation drawer
     */
    public void initNavDrawer(final DrawerLayout navDrawer)
    {
        final NavigationView navView = (NavigationView) findViewById(R.id.navigation_view);

        navView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener()
        {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem)
            {
                menuItem.setChecked(true);
                navDrawer.closeDrawers();
                return true;
            }
        });
    }

    /*
    * initialize navigation bars to allow navigation to nav drawer
    */
    private void initNavBars()
    {
       if (toolbar != null)
       {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            toolbar.setNavigationIcon(R.drawable.ic_menu_white);
            toolbar.setNavigationOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    navDrawer.openDrawer(GravityCompat.START);
                }
            });
       }
    }
}
//查询数据库中的用户类
ParseQuery=ParseQuery.getQuery(“学生类”);
query.fromLocalDatastore().whereEqualTo(“student_id”,ParseUser.getCurrentUser());
//找到它,首先查看本地数据存储,然后转到数据库
getFirstInBackground(新的GetCallback()
{
@凌驾
公共void完成(ParseObject ParseObject,parsee异常)
{
如果(e==null)
{
//检索到该对象
userClasses[PERIOD1]=parseObject.getString(“第一个周期”);
userClasses[PERIOD2]=parseObject.getString(“第二个周期”);
userClasses[PERIOD3]=parseObject.getString(“第三个周期”);
userClasses[PERIOD4]=parseObject.getString(“第四个周期”);
userClasses[PERIOD5]=parseObject.getString(“第五个周期”);
userClasses[PERIOD6]=parseObject.getString(“第六个周期”);
userClasses[PERIOD7]=parseObject.getString(“第七个周期”);
//调试:显示方法返回所需的时间
Toast.makeText(getApplicationContext(),“在调用过程中=”+userClasses[PERIOD1],Toast.LENGTH\u LONG.show();
}
其他的
{
//调试:显示是否发生异常
Toast.makeText(getApplicationContext(),“抛出异常”,Toast.LENGTH_SHORT.show();
}
}
});
//调试:显示代码达到此点所需的时间
Toast.makeText(getApplicationContext(),“after call=“+userClasses[PERIOD1],Toast.LENGTH_LONG).show();
屏幕一出现,toast“after call=”就会立即显示,并显示“after call=null”

祝酒词“during call=”大约3秒钟后出现,并说“during call=English”(这是它应该说的)

即使它不使用解析来保存它,我也不会介意。我总是可以使用parse来支持它,或者我只是做错了什么,还有更好的方法

如果你有兴趣,这里是我的全部主要活动

// query database for user's classes
ParseQuery<ParseObject> query = ParseQuery.getQuery("StudentClasses");
query.fromLocalDatastore().whereEqualTo("student_id", ParseUser.getCurrentUser());

// find it, first looking at local data store then going to database
query.getFirstInBackground(new GetCallback<ParseObject>()
{
    @Override
    public void done (ParseObject parseObject, ParseException e)
    {
        if (e == null)
        {
            // retrieved the object
            userClasses[PERIOD1] = parseObject.getString("first_period");
            userClasses[PERIOD2] = parseObject.getString("second_period");
            userClasses[PERIOD3] = parseObject.getString("third_period");
            userClasses[PERIOD4] = parseObject.getString("fourth_period");
            userClasses[PERIOD5] = parseObject.getString("fifth_period");
            userClasses[PERIOD6] = parseObject.getString("sixth_period");
            userClasses[PERIOD7] = parseObject.getString("seventh_period");

            // DEBUG: shows how long it takes for method to return
            Toast.makeText(getApplicationContext(),"during call = " + userClasses[PERIOD1], Toast.LENGTH_LONG).show();
        }
        else
        {
            // DEBUG: shows if exception happened
            Toast.makeText(getApplicationContext(),"Exception Thrown" ,Toast.LENGTH_SHORT).show();
        }
    }
});

// DEBUG: shows how long it takes for code to reach this point
Toast.makeText(getApplicationContext(),"after call = " + userClasses[PERIOD1], Toast.LENGTH_LONG).show();
    package maxbleggi.afstudentplanner;

import ... 

public class MainActivity extends AppCompatActivity
{
    // "MACROS" for user's class periods
    private final int PERIOD1 = 0;
    private final int PERIOD2 = 1;
    private final int PERIOD3 = 2;
    private final int PERIOD4 = 3;
    private final int PERIOD5 = 4;
    private final int PERIOD6 = 5;
    private final int PERIOD7 = 6;

    // toolbar
    private Toolbar toolbar;

    // navigation drawer
    private DrawerLayout navDrawer;

    // user's data
     public String[] userClasses = new String[10];

    // list to fill Classroom class with
    private List<ClassroomClass> classrooms;

    /*
    * on creation of activity
     */
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // initialise and set toolbar as actionbar
        toolbar = (Toolbar) findViewById(R.id.tool_bar);
        setSupportActionBar(toolbar);

        // initialize nav bars
        initNavBars();

        // initialize drawer layout
        NavigationView navView = (NavigationView) findViewById(R.id.navigation_view);

        // initialize nav drawer
        navDrawer = (DrawerLayout) findViewById(R.id.drawer);
        initNavDrawer(navDrawer);

        // initialize layout manager for recycler view
        RecyclerView.LayoutManager mainLayoutManager = new LinearLayoutManager(this);

        // initialize data for all classes before setting adapter
        initClassData();

        // set the adapter for recycler view
        RecyclerView.Adapter mainAdapter = new MainRecyclerAdapter(classrooms);

        // initialize recycler view elements
        RecyclerView mainRecyclerView = (RecyclerView) findViewById(R.id.main_recycler_view);

        // add layout manager to recycler view
        mainRecyclerView.setLayoutManager(mainLayoutManager);

        // add adapter to recycler view
        mainRecyclerView.setAdapter(mainAdapter);
    }

    /*
    * initializes the class data for each class
    */
    public void initClassData()
    {
        // check if a user is not cached
        ParseUser currentUser = ParseUser.getCurrentUser();
        if (currentUser == null)
        {
            // prompt user to Register screen
            // create intent to start activity
            Intent intent = new Intent(MainActivity.this, RegisterActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

            // start new activity
            startActivity(intent);

            // stop current activity
            finish();
        }

        // query database for user's classes
        ParseQuery<ParseObject> query = ParseQuery.getQuery("StudentClasses");
        query.fromLocalDatastore().whereEqualTo("student_id", ParseUser.getCurrentUser());

        // find it, first looking at local data store then going to database
        query.getFirstInBackground(new GetCallback<ParseObject>()
        {
            @Override
            public void done (ParseObject parseObject, ParseException e)
            {
                if (e == null)
                {
                    // retrieved the object
                    userClasses[PERIOD1] = parseObject.getString("first_period");
                    userClasses[PERIOD2] = parseObject.getString("second_period");
                    userClasses[PERIOD3] = parseObject.getString("third_period");
                    userClasses[PERIOD4] = parseObject.getString("fourth_period");
                    userClasses[PERIOD5] = parseObject.getString("fifth_period");
                    userClasses[PERIOD6] = parseObject.getString("sixth_period");
                    userClasses[PERIOD7] = parseObject.getString("seventh_period");

                    // DEBUG: shows how long it takes for method to return
                    Toast.makeText(getApplicationContext(),"during call = " + userClasses[PERIOD1], Toast.LENGTH_LONG).show();
                }
                else
                {
                    // DEBUG: shows if exception happened
                    Toast.makeText(getApplicationContext(),"Exception Thrown" ,Toast.LENGTH_SHORT).show();
                }
            }
        });

        // DEBUG: shows how long it takes for code to reach this point
        Toast.makeText(getApplicationContext(),"after call = " + userClasses[PERIOD1], Toast.LENGTH_LONG).show();

        // fill all fields for class periods
        classrooms = new ArrayList<>();

        // titles of classes to add to list
        String[] classTitles = {"First Period", "Second Period", "Third Period", "Fourth Period",
                "Fifth Period", "Sixth Period", "Seventh Period"};

            // iterate over every period to add it to the list
            for (int i = 0; i <= PERIOD7; i++)
            {
                // if there was a class registered for that period
                if (userClasses[PERIOD3] != null)
                {
                    // add it to the class to be added to recycler view
                    classrooms.add(new ClassroomClass(userClasses[i], classTitles[i], i + 1));
                }
            }

    }

    /*
    * initialize navigation drawer
     */
    public void initNavDrawer(final DrawerLayout navDrawer)
    {
        final NavigationView navView = (NavigationView) findViewById(R.id.navigation_view);

        navView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener()
        {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem)
            {
                menuItem.setChecked(true);
                navDrawer.closeDrawers();
                return true;
            }
        });
    }

    /*
    * initialize navigation bars to allow navigation to nav drawer
    */
    private void initNavBars()
    {
       if (toolbar != null)
       {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            toolbar.setNavigationIcon(R.drawable.ic_menu_white);
            toolbar.setNavigationOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    navDrawer.openDrawer(GravityCompat.START);
                }
            });
       }
    }
}
package maxbleggi.afstudentplanner;
进口
公共类MainActivity扩展了AppCompatActivity
{
//用于用户的类周期的“宏”
私有最终整数周期1=0;
私人最终整数周期2=1;
私人最终整数周期3=2;
私人最终整数周期4=3;
私人最终整数周期5=4;
私人最终整数周期6=5;
私人最终整数周期7=6;
//工具栏
专用工具栏;
//导航抽屉
私人抽屉布局;
//用户数据
公共字符串[]用户类=新字符串[10];
//课堂上要填写的列表
私人名单教室;
/*
*论活动的创造
*/
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化工具栏并将其设置为actionbar
工具栏=(工具栏)findViewById(R.id.tool\u栏);
设置支持操作栏(工具栏);
//初始化导航条
initNavBars();
//初始化抽屉布局
NavigationView navView=(NavigationView)findViewById(R.id.navigation\u视图);
//初始化导航抽屉
navDrawer=(抽屉布局)findViewById(R.id.抽屉);
初始化navDrawer(navDrawer);
//初始化回收器视图的布局管理器
RecyclerView.LayoutManager mainLayoutManager=新的LinearLayoutManager(此);
//在设置适配器之前初始化所有类的数据
initClassData();
//为回收器视图设置适配器
RecyclerView.Adapter mainAdapter=新的MainRecyclerAdapter(教室);
//初始化回收器视图元素
RecyclerView mainRecyclerView=(RecyclerView)findViewById(R.id.main\u recycler\u视图);
//将布局管理器添加到回收器视图
mainRecyclerView.setLayoutManager(mainLayoutManager);
//将适配器添加到回收器视图
mainRecyclerView.setAdapter(mainAdapter);
}
/*
*初始化每个类的类数据
*/
public void initClassData()
{
//检查是否未缓存用户
ParseUser currentUser=ParseUser.getCurrentUser();
if(currentUser==null)
{
//提示用户注册屏幕
//创建启动活动的意图
意向意向=新意向(MainActivity.this、RegisterActivity.class);
intent.addFlags(intent.FLAG\u ACTIVITY\u CLEAR\u TOP);
//开始新的活动
星触觉(意向);
//停止当前活动
完成();
}
//查询数据库中的用户类
解析查询=