Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.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
Android 如何使用辅助线程从数据库获取数据并填充GridView_Android_Database_Multithreading - Fatal编程技术网

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);
            }
    
  • 我本想使用AsyncTask来实现这一点,但Android 11中不推荐使用它

    我对线程有点陌生,所以我想看看是否有人能帮我正确设置它,所以工作线程调用数据库,而UI线程设置日历单元格,然后一旦工作线程完成从数据库获取事件的工作,UI线程就会将其填充到日历单元格中

    谢谢

    看一看

    • 遗嘱执行人:
    • 处理程序:
    执行者可以在后台轻松执行任务

    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();
            }
    
        }