2016-06-27 5 views
1

Мое приложение продолжает разбиваться, и я не могу понять, почему. Я подозреваю, что с методом getReactants() что-то не так, потому что кнопка работает нормально и может отображать любой другой текст, который я ввел в beq.setText().Приложение продолжает сбой

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

Вот мой код.

Java

package me.finalproject.com.apchemchemolyapp; 

import android.app.Fragment; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import java.util.ArrayList; 
import java.io.Serializable; 


/** 
* Created by Shishir on 6/9/2016. 
*/ 
public class stoich_fragment extends Fragment implements View.OnClickListener, Serializable 
{ 
    View rootview; 
    int i = 0; 
    ArrayList<Integer> arr = new ArrayList<>(); 
    ArrayList<String> elements = new ArrayList<>(); 
    boolean getElements = true; 
    String s1; 
    String element = ""; 
    EditText reactants; 
    TextView beq; 
    Button go; 
    int temp; 
    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     rootview = inflater.inflate(R.layout.stoich_layout, container, false); 
     reactants = (EditText) rootview.findViewById(R.id.reactants); 
     go = (Button) rootview.findViewById(R.id.button); 
     go.setOnClickListener(this); 
     return rootview; 
    } 
    public void onClick(View v) 
    { 
     getReactants(s1); 
     beq = (TextView) rootview.findViewById(R.id.balanced_equation); 
     beq.setText(s1); 
    } 
    public void getReactants(String s) 
    { 
     String reactant = reactants.getText().toString(); 
     //saying that reactants is null even after it went through the onCreateView method 
     String re = reactant.replaceAll("\\s+",""); 
     while(getElements) 
     { 
      String let = re.substring(i, i+1); 
      if(let.compareTo(let.toLowerCase()) > 0) 
      { 
       element += let; 
       if(i == re.length()-1 || i == re.length()) 
       { 
        elements.add(element); 
        if(re.substring(re.length()-1).equals("2")||re.substring(re.length()-1).equals("3")||re.substring(re.length()-1).equals("4")||re.substring(re.length()-1).equals("5")||re.substring(re.length()-1).equals("6")||re.substring(re.length()-1).equals("7")||re.substring(re.length()-1).equals("8")||re.substring(re.length()-1).equals("9")) 
        { 
         arr.add(Integer.parseInt(re.substring(re.length()-1))); 
        } 
        else 
        { 
         arr.add(1); 
         elements.add(re.substring(re.length()-1)); 
         arr.add(1); 
        } 
        getElements = false; 
       } 
       else if(re.substring(i+1, i+2).compareTo(re.substring(i+1, i+2).toLowerCase()) != 0) 
       { 
        if(!re.substring(i+1,i+2).equals("2")||!re.substring(i+1,i+2).equals("3")||!re.substring(i+1,i+2).equals("4")||!re.substring(i+1,i+2).equals("5")||!re.substring(i+1,i+2).equals("6")||!re.substring(i+1,i+2).equals("7")||!re.substring(i+1,i+2).equals("8")||!re.substring(i+1,i+2).equals("9")) 
        { 
         temp = 1; 
         arr.add(temp); 
        } 
       } 
      } 
      else if(let.compareTo(let.toLowerCase()) == 0) 
      { 
       element += let; 
       if(i == re.length()-1 || i == re.length()) 
       { 
        elements.add(element); 
        if(re.substring(re.length()-1).equals("2")||re.substring(re.length()-1).equals("3")||re.substring(re.length()-1).equals("4")||re.substring(re.length()-1).equals("5")||re.substring(re.length()-1).equals("6")||re.substring(re.length()-1).equals("7")||re.substring(re.length()-1).equals("8")||re.substring(re.length()-1).equals("9")) 
        { 
         arr.add(Integer.parseInt(re.substring(re.length()-1))); 
        } 
        else 
        { 
         arr.add(1); 
         elements.add(re.substring(re.length()-1)); 
         arr.add(1); 
        } 
        getElements = false; 
       } 
       else if(!re.substring(i+1,i+2).equals("2")||re.substring(i+1,i+2).equals("3")||re.substring(i+1,i+2).equals("4")||re.substring(i+1,i+2).equals("5")||re.substring(i+1,i+2).equals("6")||re.substring(i+1,i+2).equals("7")||re.substring(i+1,i+2).equals("8")||re.substring(i+1,i+2).equals("9")) 
       { 
        temp = 1; 
        arr.add(temp); 
       } 
      } 
      else if (let.equals("2")||let.equals("3")||let.equals("4")||let.equals("5")||let.equals("6")||let.equals("7")||let.equals("8")||let.equals("9")) 
      { 
       temp = Integer.parseInt(let); 
       arr.add(temp); 
       elements.add(element); 
       element = ""; 
      } 
      i++; 
      if(i == re.length()+1) 
      { 
       getElements = false; 
      } 
     } 
     // displays the elements isolated on the reactant side 
     // to test to make sure my logic works 
     for(int a = 0; a<elements.size(); a++) 
     { 
      s += (elements.get(a) + " : " + arr.get(a) + "\n"); 
     } 
    } 
} 

XML

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/reactants" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_marginTop="95dp" 
     android:textSize="20sp" 
     android:inputType="text" /> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/products" 
     android:layout_alignBottom="@+id/reactants" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:textSize="20sp" 
     android:inputType="text" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/balanced_equation" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" 
     android:textSize="30sp" /> 

<!--should make text bold and black--> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/beq" 
     android:id="@+id/title" 
     android:textSize="35sp" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:textStyle = "bold"/> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/button" 
     android:id="@+id/button" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginBottom="45dp" /> 

</RelativeLayout> 
+0

Это неправдоподобно для logcat, чтобы не было никаких ошибок вообще. Вы можете проверить, работает ли ваш logcat, добавив строку журнала в любом месте ваших методов? – Razgriz

+0

регистрировать некоторые сообщения трассировки или задавать точку останова в блоке getReactants(). Там может быть бесконечный цикл. – PWC

+0

@Razgriz Logcat работает просто отлично – vdopp

ответ

0

Это сообщения означает, что ваше приложение делает слишком много работы на это основной поток (UI Протектор).

Предлагаю положить getReactants() в AsyncTask и показать результат, когда все завершенные работы не будут блокированы основной нитью.

+0

Спасибо! Я попробую это и вернусь к вам однажды, как это произошло, когда я закончу это. – vdopp

0

Посмотрев на свой код, кажется, что у вас, вероятно, есть бесконечный цикл. Попробуйте установить флаг getElements в false в конце цикла while, чтобы убедиться, что он будет выполнен. Должно быть что-то вроде:

while(getElements) 
    { 
     String let = re.substring(i, i+1); 
     if(let.compareTo(let.toLowerCase()) > 0) 
     { 
      element += let; 
      if(re.substring(i+1, i+2).compareTo(re.substring(i+1, i+2).toLowerCase()) != 0) 
      { 
       if(!re.substring(i+1,i+2).equals("2")||re.substring(i+1,i+2).equals("3")||re.substring(i+1,i+2).equals("4")||re.substring(i+1,i+2).equals("5")||re.substring(i+1,i+2).equals("6")||re.substring(i+1,i+2).equals("7")||re.substring(i+1,i+2).equals("8")||re.substring(i+1,i+2).equals("9")) 
       { 
        temp = 1; 
        arr.add(temp); 
       } 
      } 
      i++; 
     } 
     else if(let.compareTo(let.toLowerCase()) == 0) 
     { 
      element += let; 
      if(!re.substring(i+1,i+2).equals("2")||re.substring(i+1,i+2).equals("3")||re.substring(i+1,i+2).equals("4")||re.substring(i+1,i+2).equals("5")||re.substring(i+1,i+2).equals("6")||re.substring(i+1,i+2).equals("7")||re.substring(i+1,i+2).equals("8")||re.substring(i+1,i+2).equals("9")) 
      { 
       temp = 1; 
       arr.add(temp); 
      } 
      i++; 
     } 
     else if (let.equals("2")||let.equals("3")||let.equals("4")||let.equals("5")||let.equals("6")||let.equals("7")||let.equals("8")||let.equals("9")) 
     { 
      temp = Integer.parseInt(let); 
      arr.add(temp); 
      elements.add(element); 
      element = ""; 
     } 

     if(i == re.length()) 
     { 
      getElements = false; 
     } 
     // must have an else statement here or else you will have an infinite loop if your condition is always false. 

    } 
+0

Я уверен, что это не бесконечный цикл, потому что если бы я выбрал исключение индекса из-за пределов в какой-то момент, когда я использую метод подстроки. – vdopp

0

Вы не увеличивающийся я в некоторых случаях, вы должны двигаться я ++ до конца вашего времени, чтобы избежать бесконечного цикла

я должен быть увеличен во всех случаях , рассмотрим что-то вроде этого:

if() { 
`enter code here` 
} 
else if() { 
`enter code here` 
} 
else if() { 
`enter code here` 
} 
i++; 
if(i == re.length()) { 
    getElements = false; 
} 
+0

Ха-ха спасибо, я только понял, что я забыл увеличить i в последнем случае if, но это, похоже, не устранило проблему – vdopp

+0

@vdopp, даже если вы добавите ее на свой последний, если у вас один случай отсутствует, проверьте мои отредактированный ответ – pablobu

+0

Я сделал это изменение, и я столкнулся с несколькими исключениями StringIndexOutOfBounds. Я исправил все это, добавив больше кода. Теперь ничего не происходит. – vdopp

Смежные вопросы