Android SetTextColor Error: Screen switching during mySQL call

Android SetTextColor Error: Screen switching during mySQL call

正常,正常运行。 但是,当您快速按下按钮并在 0.1 秒内切换屏幕时,它可能会关闭。 似乎在DB中加载角色时切换屏幕发生了错误。 (我用的是android工作室-php-mySQL)


快速换屏时,关闭点为setTextColor。

    // Since the timetable is up to 13th grade, i <14;
    for(int i = 0; i<14; i++)
    {
        // if the value in the current array is not empty
        if(!this.monday[i].equals(""))
        {
            // In this way, the contents of the array will be populated in a text view named 'monday'.
            monday[i].setText(this.monday[i]);

            // The color of the text changes when the lecture is present.
            monday[i].setTextColor(context.getResources().getColor(R.color.colorPrimaryDark));
        }

        else
        {
            // If it is blank, it adjusts the table size according to maxString.
            monday[i].setText(maxString);
        }
    }

和一起出错的代码就是Android连接DB的地方。这个地方根本不会造成任何问题。 (如果你慢慢按下按钮)

class BackgroundTask extends AsyncTask<Void, Void, String>
{
    String target;  

    @Override
    protected void onPreExecute() {

        try
        {   
            target = "http://MyHomepageID.cafe24.com/ScheduleList.php?userID=" + URLEncoder.encode(MainActivity. userID, "UTF-8");  //해당 웹 서버에 접속
        }

        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    @Override
    protected String doInBackground(Void... voids) {
        try {

            URL url = new URL(target);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();


            InputStream inputStream = httpURLConnection.getInputStream();


            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));


            String temp;
            StringBuilder stringBuilder = new StringBuilder();


            while ((temp=bufferedReader.readLine()) != null)
            {
                stringBuilder.append(temp + "\n");
            }


            bufferedReader.close();
            inputStream.close();
            httpURLConnection.disconnect(); 
            return stringBuilder.toString().trim();
        }

        catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public void onProgressUpdate(Void... values) {
        super.onProgressUpdate();
    }

    @Override  
    public void onPostExecute(String result) {
        try {

            JSONObject jsonObject = new JSONObject(result);


            JSONArray jsonArray = jsonObject.getJSONArray("response");  

            int count = 0;
            String courseProfessor;
            String courseTime;
            String courseTitle;
            int courseID;



            while (count < jsonArray.length())
            {
                JSONObject object = jsonArray.getJSONObject(count);


                courseID = object.getInt("courseID");
                courseProfessor = object.getString("courseProfessor");
                courseTime = object.getString("courseTime");
                courseTitle = object.getString("courseTitle");  


                schedule.addSchedule(courseTime, courseTitle, courseProfessor);
                count++;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


        schedule.setting(monday, tuesday, wednesday, thursday, friday, getContext());
    }
}

上面列出了错误日志中显示为蓝色的两个代码。

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.aaaaa.registeration, PID: 12358
              java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
                  at com.example.aaaaa.registeration.Schedule.setting(Schedule.java:685)
                  at com.example.aaaaa.registeration.ScheduleFragment$BackgroundTask.onPostExecute(ScheduleFragment.java:258)
                  at com.example.aaaaa.registeration.ScheduleFragment$BackgroundTask.onPostExecute(ScheduleFragment.java:159)
                  at android.os.AsyncTask.finish(AsyncTask.java:667)
                  at android.os.AsyncTask.-wrap1(AsyncTask.java)
                  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:684)
                  at android.os.Handler.dispatchMessage(Handler.java:102)
                  at android.os.Looper.loop(Looper.java:154)
                  at android.app.ActivityThread.main(ActivityThread.java:6119)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Application terminated.

问题总结:

  1. 正常正常使用。 (android - php - mysql)

  2. 但是,如果我在 0.1 秒内按下另一个按钮切换屏幕,则在从 DB 加载值之前切换屏幕,然后关闭。

  3. 我该如何解决?

您的 context 对象为空,这就是为什么您得到 NullPointerException 它可能尚未初始化的原因。

以及,低于

monday[i].setTextColor(context.getResources().getColor(R.color.colorPrimaryDark);

在上面的语句中,getResources().getColor() 被弃用,而不是那个,使用如下 -

monday[i].setTextColor(ContextCompat.getColor(this, R.color.color_orange_text));