Java Android, если в другом случае возникают проблемы с устранением неполадок - PullRequest
0 голосов
/ 10 мая 2018

Так что это функция, которую я создал.

Как вы можете видеть, это будет считывать файлы, ищущие filename, а затем читается как --TEMPERATURE UP--.

Проблема не в каждом filename имеет --TEMPERATURE UP-- и

Я пытался использовать оператор else, но если я удаляю break из оператора else, для filename без --TEMPERATURE UP-- все приложение вылетает

Но если я добавлю оператор break в оператор else, каждый filename будет запускать оператор else, который, даже если он содержит --TEMPERATURE UP--

Я также пытался сделать простое выражение else без !line.equals("--TEMPERATURE UP--"), но оно все равно.

Либо мне нужно добавить break в другом месте, чтобы запустить код else, который не будет запускать код if, ИЛИ я удалить break, который запускает код if, но не может запустить else код, как он будет падать.

Посоветуйте, пожалуйста, как мне изменить код, чтобы при чтении --TEMPERATURE UP-- он запускал код if, в противном случае - код else.

Большое спасибо.

public void tempUp() {
    SharedPreferences sharedTest = getSharedPreferences("MySharedTest", Context.MODE_PRIVATE);
    String filename = sharedTest.getString("filename", " ");
    Log.d("File readed: ", filename);
    File dir = new File(path);
    File[] files = dir.listFiles();
    for (File f : files) {
        if (f.isFile()) {
            BufferedReader inputStream = null;
            try {
                inputStream = new BufferedReader(new FileReader(f));
                String lineToRead = filename;
                String CurrentLine;
                while ((CurrentLine = inputStream.readLine()) != null) {
                    if (CurrentLine.equals(lineToRead)) {
                        try
                        {
                            BufferedReader reader = new BufferedReader(new FileReader(f));
                            String line = reader.readLine();
                            while(line !=null)
                            {
                                line = reader.readLine();
                                if(line.equals("--TEMPERATURE UP--"))
                                {
                                    final String ms = reader.readLine();
                                    Log.d("temp up: ", ms);
                                    new Thread(new Runnable()
                                    {
                                        @Override
                                        public void run()
                                        {
                                            String message = "\u000704NTX" + ms + "\r";
                                            byte[] byte_array = message.getBytes();

                                            try
                                            {
                                                SharedPreferences prefx = getSharedPreferences("Device_Data", Context.MODE_PRIVATE);
                                                String device_ip = prefx.getString("local_ip", " ");
                                                String host = device_ip;
                                                Socket socket = new Socket(host, 8070);
                                                DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                                                out.write(byte_array);
                                                out.flush();
                                            }
                                            catch (Exception e)
                                            {
                                            }
                                        }
                                    }).start();
                                    break;
                                }

                                else if (!line.equals("--TEMPERATURE UP--"))
                                {
                                    Toast.makeText(TestScreen.this, "There is no Temperature Display for this profile.", Toast.LENGTH_LONG).show();
                                    break;
                                }

                                }


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



                    }

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


    }
}

Обновлен:

                    try
                    {
                        BufferedReader reader = new BufferedReader(new FileReader(f));
                        String line = reader.readLine();
                        boolean hasTempDisplayProfile = false;
                        while((line = reader.readLine()) !=null)
                        {

                            if(line.equals("--TEMPERATURE UP--")) {
                                hasTempDisplayProfile = true;
                                final String ms = reader.readLine();
                                Log.d("temp up: ", ms);
                                new Thread(new Runnable() {
                                    @Override
                                    public void run() {
                                        String message = "\u000704NTX" + ms + "\r";
                                        byte[] byte_array = message.getBytes();

                                        try {
                                            SharedPreferences prefx = getSharedPreferences("Device_Data", Context.MODE_PRIVATE);
                                            String device_ip = prefx.getString("local_ip", " ");
                                            String host = device_ip;
                                            Socket socket = new Socket(host, 8070);
                                            DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                                            out.write(byte_array);
                                            out.flush();
                                        } catch (Exception e) {
                                        }
                                    }
                                }).start();
                                break;
                            }

                            }

                        if (hasTempDisplayProfile){
                            Toast.makeText(TestScreen.this, "There is no Temperature Display for this profile.", Toast.LENGTH_LONG).show();
                            break;
                        }

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

1 Ответ

0 голосов
/ 10 мая 2018

Ваша текущая реализация:

while(readLine) {
   if (line.equal("--TEMPERATURE UP--") {
     // process
   } else {
     // Toast message
   }
}

Так вы видите проблему сейчас? Проблема в том, что вы снова тестируете --TEMPERATURE UP-- для каждой строки и показывает Toast каждый раз, когда строка не совпадает.

Это неправильно.

Вам нужно проверить, не содержит ли весь файл --TEMPERATURE UP--, если да, то показать тост.

Таким образом, правильная реализация будет включать флаг:

boolean hasTempDisplayProfile = false;
while(readLine) {
   if (line.equal("--TEMPERATURE UP--") {
     // process
     hasTempDisplayProfile = true;
   }
}

if (!hasTempDisplayProfile) {
  // Toast message
}

Редактировать У вашего кода есть еще один серьезный недостаток:

String line = reader.readLine();
while(line !=null){
    line = reader.readLine();
     ... your process ...
}

В этом коде вы читаете строку. Затем проверьте, что строка не равна нулю в while. Проблема в том, что вы использовали не эту строку, а процесс для чтения другой line = reader.readLine(). Вы получите NullPointerException, когда достигнете конца файла.

Изменить на:

String line;
while((line = reader.readLine()) !=null){
     // Do not read new line here. Just process with "line"
}

Кстати, ваш код нуждается в улучшении. Теперь у него слишком много отступов, которые очень сложно читать. Вы можете попробовать:

  1. Разбейте вашу функцию на более мелкие модули
  2. Использовать fast-fast. То есть вместо переноса кода, если выполняется условие true, попробуйте вернуться, когда false. Например ваш:

      for (File f: files) {
          if (f.isFile()) {
             // Your process
          }
      }
    

следует изменить на:

      for (File f: files) {
         if (!f.isFile()) {
            continue;
         }
         // Your process
      }

Уменьшает один уровень отступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...