2016-06-27 6 views
1

私のアプリケーションはクラッシュし続けるため、なぜその理由が分かりません。ボタンがうまく動作していて、beq.setText()に入れた他のテキストを表示できるので、getReactants()メソッドに問題があると思われます。アプリケーションがクラッシュを続ける

ログキャストにエラーはありません。スレッドは単に中断され、デバイスはアプリケーションが応答していないと言って、アプリを待つか殺すことができます。

ここに私のコードです。

の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

これはまったくエラーを表示しないように思われます。あなたのメソッドのどこにでもLog lineを追加してlogcatが動作しているかどうか確認できますか? – Razgriz

+0

getReactants()のwhileブロックにいくつかのトレースメッセージを記録するか、ブレークポイントを設定します。無限ループが存在する可能性があります。 – PWC

+0

@Razgriz Logcatはうまく動いています – vdopp

答えて

0

このメッセージは、アプリケーションがそれのメインスレッド(UIトレッド)にあまりにも多くの仕事をやっている意味します。

AsyncTaskgetReactants()を入れて、すべてのプロセスがメインスレッドをブロックせずに終了したときの結果を表示することをお勧めします。

+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

ハハおかげさま私は最後のelse if文でiをインクリメントするのを忘れてしまったことに気付いたが、問題を解決するようには見えなかった – vdopp

+0

@vdoppもしあなたが最後に他のケースを追加したとしても、編集された答え – pablobu

+0

私はその変更を行い、いくつかのStringIndexOutOfBounds例外が発生しました。より多くのコードを追加することでそのすべてを修正しました。今は何も起こりません。 – vdopp

関連する問題