Java 来自本地数据存储的Android解析查询太慢
在我的主要活动中,我用字符串数组填充recyclerview;但是,我从我的解析数据库中获取这些字符串 我现在知道,当您查询信息时,该方法是异步的,这意味着它在后台运行,等待从数据库接收响应,同时代码继续运行。我遇到了这样一个问题:用字符串填充数组花费的时间太长,并且recycerview已经被填充(因为数组还没有被填充,所以使用空值) 因此,我决定使用parse在本地保存数据,并使用数据库备份信息。我的问题仍然是,这太慢了,无法为recyclerview填充我的适配器。我甚至确保它没有查询数据库,并将我的数据和互联网连接转到我正在测试的手机上。这是同一个故事 是否有人知道一种优化的方法来检索数据,以便它足够快地填充recyclerview,因为现在获取字符串需要整整3秒钟。我不想暂停我的程序3秒钟,只是为了等待解析完成它的工作 下面是我如何保存数据的Java 来自本地数据存储的Android解析查询太慢,java,android,parse-platform,saving-data,Java,Android,Parse Platform,Saving Data,在我的主要活动中,我用字符串数组填充recyclerview;但是,我从我的解析数据库中获取这些字符串 我现在知道,当您查询信息时,该方法是异步的,这意味着它在后台运行,等待从数据库接收响应,同时代码继续运行。我遇到了这样一个问题:用字符串填充数组花费的时间太长,并且recycerview已经被填充(因为数组还没有被填充,所以使用空值) 因此,我决定使用parse在本地保存数据,并使用数据库备份信息。我的问题仍然是,这太慢了,无法为recyclerview填充我的适配器。我甚至确保它没有查询数据
// 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);
//开始新的活动
星触觉(意向);
//停止当前活动
完成();
}
//查询数据库中的用户类
解析查询=