2016-07-31 65 views
0

方法getText()必須從UI線程調用線程請幫助。即時通訊在Android工作室的初學者發現這些代碼在線,但無法找到它 我真的很感激它。方法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

獲取其UI線程不在後臺線程中的值爲onPreExecute()

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線不就是一個例子

// 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

不能使用的getText的AsyncTask。 。 你必須通過這樣的參數:)

新MyAsync(執行(。firstname_et.getText()的toString(),lastname_et.getText()的toString());

然後在異步任務喲必須改變錯誤行這樣:

字符串姓名=(字符串)PARAMS [0]; String lastname =(String)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; 
     } 
相關問題