1

ボタン (このコードでは mbutton のラベル) をクリックすると、一見理由もなくアプリケーションがフリーズします。logcat は、このフリーズの原因に関する情報を提供しません。クラス全体のコードと、その下のクラスの XML を以下に示します。

コード

public class WorkoutChoice extends Activity
{
 private TextView mDateDisplay,cDateDisplay;
 private Button mPickDate;
 private int mYear,mMonth,mDay;
 private int cYear,cMonth,cDay;
 static final int DATE_DIALOG_ID = 0;
 Button   mButton;
 EditText cweight,nweight;
 TextView t,c;
 String s,s2,cDate,mDate;
 int current,target;
 DataBaseHelper db = new DataBaseHelper(this);
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.choice);
    final Context context = getApplicationContext();
    final int duration = Toast.LENGTH_SHORT;

    mDateDisplay = (TextView) findViewById(R.id.dateDisplay);
    cDateDisplay = (TextView) findViewById(R.id.Current);
    mPickDate = (Button) findViewById(R.id.pickDate);
    mPickDate.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v) {
            showDialog(DATE_DIALOG_ID);
        }
    });
    final Calendar c = Calendar.getInstance();
    cYear = c.get(Calendar.YEAR);
    cMonth = c.get(Calendar.MONTH);
    cDay = c.get(Calendar.DAY_OF_MONTH);
    mYear = c.get(Calendar.YEAR);
    mMonth = c.get(Calendar.MONTH);
    mDay = c.get(Calendar.DAY_OF_MONTH);
    cDate = (cDay+"-"+cMonth+"-"+cYear);
    mDate = (mDay+"-"+mMonth+"-"+mYear); 
    Date past = new Date(112, cMonth, cDay); // current Date
    Date today = new Date(112, 11, 18); // date Choosen by the user
    final int days = Days.daysBetween(new DateTime(past), new DateTime(today)).getDays()+1;
     cDateDisplay.setText(cDate);

     //display the current date (this method is below)
     updateDisplay();

    mButton = (Button)findViewById(R.id.get);
    cweight   = (EditText)findViewById(R.id.cweight);
    nweight   = (EditText)findViewById(R.id.nweight);
    t = (TextView)findViewById(R.id.out);

    mButton.setOnClickListener(
        new View.OnClickListener()
        {
            public void onClick(View view)
            {
                db.open();
                while(cweight != null && nweight  != null);
                {
                    s = WorkoutChoice.this.cweight.getText().toString();
                    current =  Integer.parseInt(s);
                    s2 = WorkoutChoice.this.nweight.getText().toString();
                    target =  Integer.parseInt(s2);
                    db.deleteFirst();
                    db.insertTitle(mDate, current, target);
                    CharSequence text = "Goal Set\n"+"Target Date"+mDate+"\n"+"Current Weight "+current+"\n"+"Target Weight "+target;
                    Toast toast = Toast.makeText(context, text, duration);
                    toast.show();
                    /*Intent i = new Intent();
                    i.setClassName("com.b00348312.workout","com.b00348312.workout.WorkoutMenu");
                    startActivity(i);*/
                }
               db.close(); 
            }
        });

}
public void convert(View view) 
{
    Intent i = new Intent();
    i.setClassName("com.b00348312.workout","com.b00348312.workout.convert");
    startActivity(i); 
}
 private void updateDisplay() {
        mDateDisplay.setText(
            new StringBuilder()
                    // Month is 0 based so add 1
                    .append(mDay).append("-")
                    .append(mMonth + 1).append("-")
                    .append(mYear).append(" "));
        /*cDateDisplay.setText(
                new StringBuilder()
                        // Month is 0 based so add 1
                        .append(cDay).append("-")
                        .append(cMonth + 1).append("-")
                        .append(cYear).append(" "));*/
    } 
 private DatePickerDialog.OnDateSetListener mDateSetListener =
            new DatePickerDialog.OnDateSetListener() {

                public void onDateSet(DatePicker view, int year, 
                                      int monthOfYear, int dayOfMonth) {
                    mYear = year;
                    mMonth = monthOfYear;
                    mDay = dayOfMonth;
                    updateDisplay();
                }
            };
           @Override
           protected Dialog onCreateDialog(int id) {
                switch (id) {
                case DATE_DIALOG_ID:
                    return new DatePickerDialog(this,
                                mDateSetListener,
                                mYear, mMonth, mDay);
                }
                return null;
            }
}
<?xml version="1.0" encoding="utf-8"?>

<TextView
    android:id="@+id/Cdate"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Current Date"
    android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="#000000"/>

<TextView
    android:id="@+id/Current"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text=""
    android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="#000000"/>

<TextView
    android:id="@+id/blank"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Target"
    android:textColor="#000000" />
<TextView
    android:id="@+id/dateDisplay"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text=""
    android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="#000000"/>
<Button
    android:id="@+id/pickDate"
    android:layout_width="324dp"
    android:layout_height="wrap_content"
    android:text="Change the date"/>
<TextView
     android:text="Enter Enter Current Weight (Kg)" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" android:textColor="#00000F">
</TextView>
<EditText
    android:id="@+id/cweight"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="numberDecimal" >
        <requestFocus></requestFocus>
</EditText>
<TextView android:text="Enter Desired Weight(kg)" 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:textStyle="bold" android:textColor="#00000F"></TextView>

<EditText
    android:id="@+id/nweight"
    android:layout_width="320dp"
    android:layout_height="wrap_content"
    android:inputType="numberDecimal" >

4

2 に答える 2

2

あなたのコードは無限ループにあります。

変化する: while(cweight != null && nweight != null);

に: if(cweight != null && nweight != null);

もう 1 つ: ここで null を確認しますか? データベースにクエリを実行する前に、ここで値が適切であることを確認します。それらがnullになることはないと思います。(他のエラーもあるでしょう)

于 2012-05-27T16:54:36.483 に答える
1

Asycn タスクを使用するなどの非 UI スレッドで onclick 作業を行うか、他のスレッドを作成してハンドラーを使用します。これはデータベース作業であり、時間がかかる可能性があるためです...

于 2012-05-27T16:47:35.130 に答える