2016-06-27 3 views
1

내 응용 프로그램이 계속 충돌하고 이유를 파악할 수 없습니다. 단추가 잘 작동하고 beq.setText()에 넣은 다른 텍스트를 표시 할 수 있기 때문에 getReactants() 메서드에 문제가 있다고 의심됩니다.응용 프로그램이 계속 충돌 함

logcat에 오류가 없으므로 스레드가 일시 중단되고 장치에서 응용 프로그램이 응답하지 않는다고 말하면서 응용 프로그램을 기다리거나 죽일 수 있습니다.

여기 내 코드입니다.

자바

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

Erk는 logcat이 전혀 오류를 표시하지 않을 것입니다. 로그 랭크 (logcat)가 메소드의 어느 위치 에나 로그 라인을 추가하여 작동하는지 확인할 수 있습니까? – Razgriz

+0

getReactants()의 while 블록에 일부 추적 메시지를 기록하거나 중단 점을 설정하십시오. 무한 루프가있을 수 있습니다. – PWC

+0

@Razgriz Logcat은 잘 작동합니다. – vdopp

답변

0

이 메시지는 메인 스레드 (UI 트레드가)의에서 응용 프로그램이 너무 많은 일을 의미합니다.

getReactants()AsyncTask에 넣고 모든 스레드가 주 스레드를 차단하지 않고 모든 프로세스가 완료되면 결과를 표시하는 것이 좋습니다.

+0

고마워요! 나는 이것을 끝내고 일단 끝내면 어떻게 돌아가는지 한 번 생각해 볼 것입니다. – vdopp

0

코드를 보면 아마 무한 루프가있는 것 같습니다. while 루프가 끝날 때 getElements 플래그를 false으로 설정하여 실행되는지 확인하십시오. 같은이어야합니다 : 당신은 어떤 경우에 나는를 증가하지 않는

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를 증가시키는 것을 잊었다는 것을 깨달았습니다. 문제가 해결되지 않은 것 같습니다. – vdopp

+0

@vdopp 한 사례가 누락 된 경우 마지막으로 추가하더라도, 내 사례를 확인하십시오. 편집 된 대답 – pablobu

+0

나는 그 변화를 만들었고 여러 StringIndexOutOfBounds 예외를 만났다. 더 많은 코드를 추가하여이 모든 것을 수정했습니다. 이제는 아무 일도 일어나지 않습니다. – vdopp

관련 문제