-1

我正在學習AsyncTask類和下面的例子來練習。我有一個UI有一個EditText(用於數據輸入),一個有5個單選按鈕的radiogroup和一個按鈕(提交)。這個想法是當用戶選擇單選按鈕併爲EDITTEXT輸入一個值時。按下按鈕後,信息將轉到數據庫表。數據庫表被創建並且整個代碼工作。但是我想用AsyncTask在後臺運行數據庫操作函數。應用AsyncTask類後出現問題。請幫幫我。SQlite數據庫操作和AsyncTask

這裏是代碼工作沒有的AsyncTask:

package jhapps.com.myspending; 

    import android.os.Bundle; 
    import android.support.design.widget.FloatingActionButton; 
    import android.support.design.widget.Snackbar; 
    import android.support.v7.app.AppCompatActivity; 
    import android.support.v7.widget.Toolbar; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.RadioButton; 
    import android.widget.RadioGroup; 
    import android.widget.Toast; 

    public class Child extends AppCompatActivity { 

private static Button btnsubmit; 
private static RadioGroup rgChild; 
private static RadioButton rbChild; 
private static EditText dollarAmount; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_child); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 
    DataSubmitChild(); 
} 

private void DataSubmitChild(){ 
    btnsubmit=(Button)findViewById(R.id.btnSubmitChild); 
    btnsubmit.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      rgChild = (RadioGroup) findViewById(R.id.rgChildren); 
      int selectedRbChild = rgChild.getCheckedRadioButtonId(); 
      rbChild = (RadioButton) findViewById(selectedRbChild); 
      String rbChildF = rbChild.getText().toString(); 



      dollarAmount = (EditText) findViewById(R.id.amountEnterChild); 
      String dollarAmountF = dollarAmount.getText().toString(); 
      float dollarAmountFloat = Float.parseFloat(dollarAmountF); 





     DataBaseHelper dataBaseHelper = new DataBaseHelper(Child.this); 

     if (dollarAmountFloat != 0 & rbChildF != "") { 
      int itemID; 

      switch (rbChildF) { 
       case "Daycare":itemID=53; 
        dataBaseHelper.insertDataSpending(itemID, dollarAmountFloat); 
        break; 
       case "Lessons and Activities": itemID=54; 
        dataBaseHelper.insertDataSpending(itemID, dollarAmountFloat); 
        break; 
       case "Allowance":itemID=55; 
        dataBaseHelper.insertDataSpending(itemID, dollarAmountFloat); 
        break; 
       case "School Supplies and Fees" :itemID=56; 
        dataBaseHelper.insertDataSpending(itemID, dollarAmountFloat); 
        break; 
       case "Babysitting":itemID=57; 
        dataBaseHelper.insertDataSpending(itemID, dollarAmountFloat); 
        break; 

      } 
      Toast.makeText(Child.this,"Your spending is recorded!",Toast.LENGTH_LONG).show(); 

      dollarAmount.setText(""); 
      rgChild.clearCheck(); 
     }else 
      Toast.makeText(Child.this,"Please choose an Item",Toast.LENGTH_LONG).show(); 
     } 

    }); 


    } 

} 

這裏是用的AsyncTask代碼沒有工作:

package jhapps.com.myspending; 

    import android.content.Context; 
    import android.os.AsyncTask; 
    import android.os.Bundle; 
    import android.support.design.widget.FloatingActionButton; 
    import android.support.design.widget.Snackbar; 
    import android.support.v7.app.AppCompatActivity; 
    import android.support.v7.widget.Toolbar; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.RadioButton; 
    import android.widget.RadioGroup; 
    import android.widget.Toast; 

    public class Child extends AppCompatActivity { 
private static Button btnsubmit; 
private static RadioGroup rgChild; 
private static RadioButton rbChild; 
private EditText dollarAmount; 

Context ctx; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_child); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 
    //DataSubmitChild(); 
    rgChild = (RadioGroup) findViewById(R.id.rgChildren); 
    int selectedRbChild = rgChild.getCheckedRadioButtonId(); 
    rbChild = (RadioButton) findViewById(selectedRbChild); 

    dollarAmount = (EditText) findViewById(R.id.amountEnterChild); 



    btnsubmit=(Button)findViewById(R.id.btnSubmitChild); 
    btnsubmit.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      BackgroundTask backgroundTask=new BackgroundTask(); 
      backgroundTask.execute(); 
     } 
    }); 
    dollarAmount.setText(""); 
    rgChild.clearCheck(); 
} 
    private class BackgroundTask extends AsyncTask<Void,Void,Void>{ 
String rbChildF = rbChild.getText().toString(); 
String dollarAmountF = dollarAmount.getText().toString(); 
float dollarAmountFloat = Float.parseFloat(dollarAmountF); 

@Override 
protected Void doInBackground(Void... params) { 


    DataBaseHelper dataBaseHelper = new DataBaseHelper(getBaseContext()); 

      if (dollarAmountFloat != 0 & rbChildF != "") { 
       int itemID; 

       switch (rbChildF) { 
        case "Daycare":itemID=53; 
         dataBaseHelper.insertDataSpending(itemID, dollarAmountFloat); 
         break; 
        case "Lessons and Activities": itemID=54; 
         dataBaseHelper.insertDataSpending(itemID, dollarAmountFloat); 
         break; 
        case "Allowance":itemID=55; 
         dataBaseHelper.insertDataSpending(itemID, dollarAmountFloat); 
         break; 
        case "School Supplies and Fees" :itemID=56; 
         dataBaseHelper.insertDataSpending(itemID, dollarAmountFloat); 
         break; 
        case "Babysitting":itemID=57; 
         dataBaseHelper.insertDataSpending(itemID, dollarAmountFloat); 
         break; 

       } 
       Toast.makeText(Child.this,"Your spending is recorded!",Toast.LENGTH_LONG).show(); 


      }else 
       Toast.makeText(Child.this,"Please choose an Item",Toast.LENGTH_LONG).show(); 

    return null; 
} 

} }

這裏是錯誤信息:

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: jhapps.com.myspending, PID: 27613 
       java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.widget.RadioButton.getText()' on a null object reference 
        at jhapps.com.myspending.Child$BackgroundTask.<init>(Child.java:62) 
        at jhapps.com.myspending.Child$BackgroundTask.<init>(Child.java:0) 
        at jhapps.com.myspending.Child$2.onClick(Child.java:54) 
        at android.view.View.performClick(View.java:5198) 
        at android.view.View$PerformClick.run(View.java:21147) 
        at android.os.Handler.handleCallback(Handler.java:739) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:5417) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

回答

1

這些觀點都是空...

private class BackgroundTask extends AsyncTask<Void,Void,Void>{ 

    // Don't put these here... 
    String rbChildF = rbChild.getText().toString(); 
    String dollarAmountF = dollarAmount.getText().toString(); 
    float dollarAmountFloat = Float.parseFloat(dollarAmountF); 

如果你真的需要這些值,然後做出一個構造

private class BackgroundTask extends AsyncTask<Void,Void,Void>{ 

    String rbChildF, dollarAmountF; 
    float dollarAmount; 

    public BackgroundTask(String radio, String dollarAmtF, float dollars) { 
     this.rbChildF = radio; 
     this.dollarAmountF = dollarAmtF; 
     this.dollarAmount = dollars; 
    } 

而且在傳遞這些價值

String rbChildF = rbChild.getText().toString(); 
    String dollarAmountF = dollarAmount.getText().toString(); 
    float dollarAmountFloat = Float.parseFloat(dollarAmountF); 

    new BackgroundTask(rbChildF, dollarAmountF, dollarAmountFloat).execute(); 
+0

很多很多謝謝!這是一個很大的幫助!它有助於我理解這個概念。 –

0

man asyctask是一個獨立的腳本塊,它不知道你的意見值。 爲了使asynctask知道你的視圖edittext或radio值,你應該把父視圖傳遞給asyctask的構造函數。在構造函數體內使用findviewbyid來檢索將在doinbackground方法中使用的值。

請記住。構造函數和onpostexecute在主線程上執行。 asyctask包含在doinbackground中發生的事情。

+0

謝謝你的理念。它有助於我理解一般的類和android。 –