2016-07-31 14 views
0

メソッドgetText()をUIスレッドから呼び出す必要があります。私はアンドロイドスタジオの初心者がこれらのコードをオンラインで見つけましたが、それを理解できませんでした 私は本当にそれを感謝します。メソッドgetText()をUIスレッドから呼び出す必要があります。

public class MainActivity extends AppCompatActivity { 

    TableLayout table_layout; 
    EditText firstname_et, lastname_et; 
    Button addmem_btn; 

    SQLController sqlcon; 

    ProgressDialog PD; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     sqlcon = new SQLController(this); 

     firstname_et = (EditText) findViewById(R.id.fistname_et_id); 
     lastname_et = (EditText) findViewById(R.id.lastname_et_id); 
     addmem_btn = (Button) findViewById(R.id.addmem_btn_id); 
     table_layout = (TableLayout) findViewById(R.id.tableLayout1); 

     BuildTable(); 

     addmem_btn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       new MyAsync().execute(); 

      } 
     }); 

    } 

    private void BuildTable() { 

     sqlcon.open(); 
     Cursor c = sqlcon.readEntry(); 

     int rows = c.getCount(); 
     int cols = c.getColumnCount(); 

     c.moveToFirst(); 

     // outer for loop 
     for (int i = 0; i < rows; i++) { 

      TableRow row = new TableRow(this); 
      row.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 
        LayoutParams.WRAP_CONTENT)); 

      // inner for loop 
      for (int j = 0; j < cols; j++) { 

       TextView tv = new TextView(this); 
       tv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 
         LayoutParams.WRAP_CONTENT)); 

       tv.setGravity(Gravity.CENTER); 
       tv.setTextSize(18); 
       tv.setPadding(0, 5, 0, 5); 

       tv.setText(c.getString(j)); 

       row.addView(tv); 

      } 

      c.moveToNext(); 

      table_layout.addView(row); 

     } 
     sqlcon.close(); 
    } 

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

     @Override 
     protected void onPreExecute() { 

      super.onPreExecute(); 

      table_layout.removeAllViews(); 

      PD = new ProgressDialog(MainActivity.this); 
      PD.setTitle("Please Wait.."); 
      PD.setMessage("Loading..."); 
      PD.setCancelable(false); 
      PD.show(); 
     } 

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

      **String firstname = firstname_et.getText().toString(); 
      String lastname = lastname_et.getText().toString();** 

      // inserting data 
      sqlcon.open(); 
      sqlcon.insertData(firstname, lastname); 
      // BuildTable(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      BuildTable(); 
      PD.dismiss(); 
     } 
    } 

} 
+0

であなたのコードを置き換えますか? –

答えて

0

値をonPreExecute()に設定し、UIスレッドはバックグラウンドスレッドではありません。

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

     String firstname,lastname; 
     @Override 
     protected void onPreExecute() { 

      super.onPreExecute(); 

      table_layout.removeAllViews(); 

      PD = new ProgressDialog(MainActivity.this); 
      PD.setTitle("Please Wait.."); 
      PD.setMessage("Loading..."); 
      PD.setCancelable(false); 
      // get values here its UI thread 
      firstname = firstname_et.getText().toString(); 
      lastname = lastname_et.getText().toString(); 
      PD.show(); 
     } 

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

      // **String firstname = firstname_et.getText().toString(); 
      // String lastname = lastname_et.getText().toString();** 

      // inserting data 
      sqlcon.open(); 
      sqlcon.insertData(firstname, lastname); 
      // BuildTable(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      BuildTable(); 
      PD.dismiss(); 
     } 
    } 
+0

ありがとうございます。できます – Manuel

0

UIスレッドは、実行できないバックグラウンドスレッド(非同期タスク)からアクセスしています。

String firstname = firstname_et.getText().toString(); 
      String lastname = lastname_et.getText().toString(); 

ここにいない非同期タスクであなたのUIスレッドで

をtheeseの行を追加します。たとえば、あなたがAsyncTaskのgetTextを使用することはできません

// ui thread 
    // call async task and send UI data 
    new checkLogInDetails(editEmail.getText().toString(), editPassword.getText().toString()).execute(); 

// you can change the params of async task as your requirement 
private class checkLogInDetails extends AsyncTask<Void, String, Void> { 

     private final String userName; 
     private final String password; 

//create a constructor an access UI thread data 
     public checkLogInDetails(String userName, String password) { 
      this.userName = userName; 
      this.password = password; 

     } 

@Override 
protected void onPreExecute()... 
+0

MyAsyncのfirstNameとlastNameクラスの変数を作成し、onPreExecute()で設定してください。 – lionscribe

0

です。 。 あなたは、このようにパラメータを渡す必要があります:

新しいMyAsync()を実行(。。firstname_et.getText()のtoString()、lastname_et.getText()のtoString());ヨーヨーが、これにエラー行を変更する必要が非同期タスク内次いで

文字列FIRSTNAME =(文字列)のparams [0]。 文字列lastname =(文字列)params [1];

0

正確なエラーや問題である何この

String firstname; 
    String secondname;  

     @Override 
     protected void onPreExecute(){ 
     firstname = firstname_et.getText().toString(); 
     lastname = lastname_et.getText().toString(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      // inserting data 
      sqlcon.open(); 
      sqlcon.insertData(firstname, lastname); 
      // BuildTable(); 
      return null; 
     } 
関連する問題