Search code examples
androidmysqlandroid-studio-3.0settext

Android SetTextColor Error: Screen switching during mySQL call


Normally, it operates normally. However, when you press the button quickly and switch the screen in 0.1 second, it may close. It seems that an error has occurred by switching the screen while loading the character in DB. (I use android studio - php - mySQL)

enter image description here


When you change the screen quickly, the close point is 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);
        }
    }

And the code that causes the error together is the point where Android connects with DB. This place does not cause any problems at all. (If you press the button slowly)

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

The two codes that appear blue in the error log are listed above.

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.

summary of the questions:

  1. Normally works normally. (android - php - mysql)

  2. However, if I switch the screen by pressing the another button in 0.1 seconds, the screen is changed before the value is loaded from the DB, and it is closed.

  3. How do I resolve this?


Solution

  • Your context object is null, thats why you are getting NullPointerException it may have not been initialized.

    As well as, below

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

    In this above statement, getResources().getColor() is deprecated instead of that, use like below -

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