Android 如何使用辅助线程从数据库获取数据并填充GridView
我正在开发一个日历应用程序,它从数据库中检索事件并将它们填充到我的自定义日历中Android 如何使用辅助线程从数据库获取数据并填充GridView,android,database,multithreading,Android,Database,Multithreading,我正在开发一个日历应用程序,它从数据库中检索事件并将它们填充到我的自定义日历中 public class GridAdapter extends ArrayAdapter { private LayoutInflater mInflater; private List<Date> monthlyDates; private Calendar currentDate; private List<Calendar> allEvents; ShiftManager shif
public class GridAdapter extends ArrayAdapter {
private LayoutInflater mInflater;
private List<Date> monthlyDates;
private Calendar currentDate;
private List<Calendar> allEvents;
ShiftManager shiftManager;
Calendar theDay = null;
Context context;
Calendar dateCal;
public GridAdapter(Context context, List<Date> monthlyDates, Calendar currentDate, List<Calendar> allEvents) {
super(context, com.example.trackmypay.R.layout.single_cell_layout);
this.monthlyDates = monthlyDates;
this.currentDate = currentDate;
this.allEvents = allEvents;
shiftManager = new ShiftManager((FragmentActivity)context);
mInflater = LayoutInflater.from(context);
this.context = context;
}
@NonNull
@Override
public View getView(int position, View convertView, final ViewGroup parent) {
Date mDate = monthlyDates.get(position);
dateCal = Calendar.getInstance();
dateCal.setTime(mDate);
dateCal.set(Calendar.HOUR_OF_DAY, 0);
dateCal.set(Calendar.MINUTE, 0);
dateCal.set(Calendar.SECOND, 0);
dateCal.set(Calendar.MILLISECOND, 0);
final int dayValue = dateCal.get(Calendar.DAY_OF_MONTH);
final int displayMonth = dateCal.get(Calendar.MONTH) + 1;
final int displayYear = dateCal.get(Calendar.YEAR);
final int currentMonth = currentDate.get(Calendar.MONTH) + 1;
final int currentYear = currentDate.get(Calendar.YEAR);
View view = convertView;
theDay = shiftManager.retrieveShiftsForCalendar(dateCal.getTimeInMillis());
if(view == null){
view = mInflater.inflate(com.example.trackmypay.R.layout.single_cell_layout, parent, false);
}
if(displayMonth != currentMonth || displayYear != currentYear){
TextView dayNum = view.findViewById(R.id.calendar_date_id);
dayNum.setTextColor(Color.parseColor("#b4b5bf"));
}
//Add day to calendar
TextView cellNumber = view.findViewById(R.id.calendar_date_id);
cellNumber.setText(String.valueOf(dayValue));
Calendar tempC = Calendar.getInstance();
if (dayValue == tempC.get(Calendar.DAY_OF_MONTH) && currentMonth == tempC.get(Calendar.MONTH) + 1 && currentYear == tempC.get(Calendar.YEAR))
{
cellNumber.setTextColor(Color.parseColor("#01579B"));
cellNumber.setTypeface(Typeface.DEFAULT_BOLD);
}
ImageView eventIndicator = view.findViewById(R.id.event_id);
if (theDay != null && dayValue == theDay.get(Calendar.DAY_OF_MONTH) && displayMonth == theDay.get(Calendar.MONTH) + 1 && displayYear == theDay.get(Calendar.YEAR)) {
eventIndicator.setImageResource(R.drawable.ic_work);
}
//Add events to the calendar
return view;
}
TextView cellNumber = view.findViewById(R.id.calendar_date_id);
cellNumber.setText(String.valueOf(dayValue));
Calendar tempC = Calendar.getInstance();
if (dayValue == tempC.get(Calendar.DAY_OF_MONTH) && currentMonth == tempC.get(Calendar.MONTH) + 1 && currentYear == tempC.get(Calendar.YEAR))
{
cellNumber.setTextColor(Color.parseColor("#01579B"));
cellNumber.setTypeface(Typeface.DEFAULT_BOLD);
}
ImageView eventIndicator = view.findViewById(R.id.event_id);
if (theDay != null && dayValue == theDay.get(Calendar.DAY_OF_MONTH) && displayMonth == theDay.get(Calendar.MONTH) + 1 && displayYear == theDay.get(Calendar.YEAR)) {
eventIndicator.setImageResource(R.drawable.ic_work);
}
- 遗嘱执行人:
- 处理程序:
Executors.newSingleThreadExecutor().execute(()->{
//Background task
});
而处理程序使在主线程中执行代码变得容易
new Handler(Looper.getMainLooper()).post(() -> {
// Main thread code
});
这些都是简单的代码片段,您可以保留对实际执行器实例或处理程序实例的引用,以避免大量代码重复
如果可能的话,您应该检查Android(Room、ViewModel、LiveData)中的架构组件(),它以更优雅的方式解决了这个问题,但它可能需要对您当前的代码库进行全面重构。最终对我有效的解决方案:
final Executor execDbCall = Executors.newCachedThreadPool();
Runnable dbCall = new Runnable() {
@Override
public void run() {
synchronized (execDbCall)
{
theDay = shiftManager.retrieveShiftsForCalendar(dateCal.getTimeInMillis());
execDbCall.notify();
}
}
};
Runnable buildUI = new Runnable() {
@Override
public void run() {
if(view[0] == null){
view[0] = mInflater.inflate(com.example.trackmypay.R.layout.single_cell_layout, parent, false);
}
if(displayMonth != currentMonth || displayYear != currentYear){
TextView dayNum = view[0].findViewById(R.id.calendar_date_id);
dayNum.setTextColor(Color.parseColor("#b4b5bf"));
}
//Add day to calendar
TextView cellNumber = view[0].findViewById(R.id.calendar_date_id);
cellNumber.setText(String.valueOf(dayValue));
Calendar tempC = Calendar.getInstance();
if (dayValue == tempC.get(Calendar.DAY_OF_MONTH) && currentMonth == tempC.get(Calendar.MONTH) + 1 && currentYear == tempC.get(Calendar.YEAR))
{
cellNumber.setTextColor(Color.parseColor("#01579B"));
cellNumber.setTypeface(Typeface.DEFAULT_BOLD);
}
}
};
Runnable setEvent = new Runnable() {
@Override
public void run() {
ImageView eventIndicator = view[0].findViewById(R.id.event_id);
if (theDay != null && dayValue == theDay.get(Calendar.DAY_OF_MONTH) && displayMonth == theDay.get(Calendar.MONTH) + 1 && displayYear == theDay.get(Calendar.YEAR)) {
eventIndicator.setImageResource(R.drawable.ic_work);
}
}
};
((FragmentActivity)context).runOnUiThread(buildUI);
synchronized (execDbCall)
{
execDbCall.execute(dbCall);
try {
execDbCall.wait();
((FragmentActivity)context).runOnUiThread(setEvent);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
谢谢你djleop让我走上了解决方案的轨道
final Executor execDbCall = Executors.newCachedThreadPool();
Runnable dbCall = new Runnable() {
@Override
public void run() {
synchronized (execDbCall)
{
theDay = shiftManager.retrieveShiftsForCalendar(dateCal.getTimeInMillis());
execDbCall.notify();
}
}
};
Runnable buildUI = new Runnable() {
@Override
public void run() {
if(view[0] == null){
view[0] = mInflater.inflate(com.example.trackmypay.R.layout.single_cell_layout, parent, false);
}
if(displayMonth != currentMonth || displayYear != currentYear){
TextView dayNum = view[0].findViewById(R.id.calendar_date_id);
dayNum.setTextColor(Color.parseColor("#b4b5bf"));
}
//Add day to calendar
TextView cellNumber = view[0].findViewById(R.id.calendar_date_id);
cellNumber.setText(String.valueOf(dayValue));
Calendar tempC = Calendar.getInstance();
if (dayValue == tempC.get(Calendar.DAY_OF_MONTH) && currentMonth == tempC.get(Calendar.MONTH) + 1 && currentYear == tempC.get(Calendar.YEAR))
{
cellNumber.setTextColor(Color.parseColor("#01579B"));
cellNumber.setTypeface(Typeface.DEFAULT_BOLD);
}
}
};
Runnable setEvent = new Runnable() {
@Override
public void run() {
ImageView eventIndicator = view[0].findViewById(R.id.event_id);
if (theDay != null && dayValue == theDay.get(Calendar.DAY_OF_MONTH) && displayMonth == theDay.get(Calendar.MONTH) + 1 && displayYear == theDay.get(Calendar.YEAR)) {
eventIndicator.setImageResource(R.drawable.ic_work);
}
}
};
((FragmentActivity)context).runOnUiThread(buildUI);
synchronized (execDbCall)
{
execDbCall.execute(dbCall);
try {
execDbCall.wait();
((FragmentActivity)context).runOnUiThread(setEvent);
} catch (InterruptedException e) {
e.printStackTrace();
}
}