2017-09-01 80 views
-1

我得到這個error.Android錯誤,方法getText必須從UI線程調用,目前,傳染線程是工人。該怎麼辦?我嘗試了幾乎所有我找到的解決方案,但仍然無法正常工作。任何人都可以幫忙?試圖解決它,但沒有什麼幫助。現在我該怎麼做?在此先感謝Android錯誤,方法getText必須從UI線程調用,當前傳染線程是worker。該怎麼辦?

package net.simple.insertintomysql; 

import android.os.AsyncTask; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 
import java.util.ArrayList; 
import java.util.List; 


public class MainActivity extends ActionBarActivity { 

    EditText editTextStoreName; 
    EditText editTextName; 
    EditText editTextFeedback; 


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

     editTextStoreName = (EditText) findViewById(R.id.editTextstoreName); 
     editTextName = (EditText) findViewById(R.id.editTextName); 
     editTextFeedback = (EditText) findViewById(R.id.editTextFeedback); 

    } 

    public void insert(View view){ 
     String storename = editTextStoreName.getText().toString(); 
     String name = editTextName.getText().toString(); 
     String feedback= editTextFeedback.getText().toString(); 
     insertToDatabase(storename,name,feedback); 
    } 

    private void insertToDatabase(String storename, String name, String feedback){ 
     class SendPostReqAsyncTask extends AsyncTask<String, Void, String> { 
      @Override 
      protected String doInBackground(String... params) { 
       final String paramStorename = params[0]; 
       String paramName = params[1]; 
       String paramFeedback = params[2]; 

       //InputStream is = null; 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         final String storename = editTextStoreName.getText().toString(); 
         final String name = editTextName.getText().toString(); 
         final String feedback = editTextFeedback.getText().toString(); 
        } 
       }); 


       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
       nameValuePairs.add(new BasicNameValuePair("storename", storename)); 
       nameValuePairs.add(new BasicNameValuePair("name", name)); 
       nameValuePairs.add(new BasicNameValuePair("feedback", feedback)); 

       try { 
        HttpClient httpClient = new DefaultHttpClient(); 
        HttpPost httpPost = new HttpPost(
          "http://10.238.4.249/new/user_feedback.php"); 
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
        HttpResponse response = httpClient.execute(httpPost); 
        HttpEntity entity = response.getEntity(); 

        //is = entity.getContent(); 


       } catch (ClientProtocolException e) { 

       } catch (IOException e) { 

       } 
       return "success"; 
      } 

      @Override 
      protected void onPostExecute(String result) { 
       super.onPostExecute(result); 

       Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show(); 
       TextView textViewResult = (TextView) findViewById(R.id.textViewResult); 
       textViewResult.setText("Inserted"); 
      } 
     } 
     SendPostReqAsyncTask sendPostReqAsyncTask = new SendPostReqAsyncTask(); 
     sendPostReqAsyncTask.execute(storename, name, feedback); 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 
+0

查看在UI線程中運行了什麼'AsyncTask'方法 – pskink

+0

是的。你已經定義了你的方法,比如'private void insertToDatabase(String storename,String name,String feedback){..'那你爲什麼要用'String storename = editTextStoreName.getText()。toString(); String name = editTextName.getText()。toString(); String feedback = editTextFeedback.getText()。toString();'。只需使用'private void insertToDatabase(editTextName.getText()。toString(),editTextName.getText()。toString(),editTextFeedback.getText()。toString()){' – Piyush

+1

Android不允許訪問Ui組件後臺線程。然而,如果你閱讀'AsyncTask'文檔,你會發現它有3種特定的方法來處理Ui線程。 https://developer.android.com/reference/android/os/AsyncTask.html –

回答

1

使用此代碼,可能是它幫助你:

private void insertToDatabase(Activity activity){ 
      class SendPostReqAsyncTask extends AsyncTask<String, Void, String> { 
String storename=null; 
String name=null; 
String feedback=null; 
       @Override 
       protected String doInBackground(String... params) { 
        String paramStorename = params[0]; 
        String paramName = params[1]; 
        String paramFeedback = params[2]; 

        //InputStream is = null; 
    activity.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       storename = editTextStoreName.getText().toString(); 
        name = editTextName.getText().toString(); 
        feedback = editTextFeedback.getText().toString(); 
      } 
     }); 


        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
        nameValuePairs.add(new BasicNameValuePair("storename", storename)); 
        nameValuePairs.add(new BasicNameValuePair("name", name)); 
        nameValuePairs.add(new BasicNameValuePair("feedback", feedback)); 

        try { 
         HttpClient httpClient = new DefaultHttpClient(); 
         HttpPost httpPost = new HttpPost(
           "http://10.238.4.249/new/user_feedback.php"); 
         httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
         HttpResponse response = httpClient.execute(httpPost); 
         HttpEntity entity = response.getEntity(); 

         //is = entity.getContent(); 


        } catch (ClientProtocolException e) { 

        } catch (IOException e) { 

        } 
        return "success"; 
       } 

       @Override 
       protected void onPostExecute(String result) { 
        super.onPostExecute(result); 

        Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show(); 
        TextView textViewResult = (TextView) findViewById(R.id.textViewResult); 
        textViewResult.setText("Inserted"); 
       } 
      } 
      SendPostReqAsyncTask sendPostReqAsyncTask = new SendPostReqAsyncTask(); 
      sendPostReqAsyncTask.execute(storename, name, feedback); 
     } 

讓我知道你的迴應。

+0

這裏的「活動」究竟是什麼?在某種程度上是'Context'的情況下,這個解決方案是錯誤的,因爲任務執行時上下文可能不可用。 –

+0

沒有工作。將錯誤顯示爲「從內部類訪問的變量,使用final」。對於這些行「nameValuePairs.add(new BasicNameValuePair(」storename「,storename)); nameValuePairs.add(new BasicNameValuePair(」name「,name)); nameValuePairs.add(new BasicNameValuePair(」feedback「,feedback)) ;」我嘗試使用final關鍵字。但沒有幫助 – user7939485

+0

@ user7939485使變量global.let我編輯答案 –

相關問題