2016-05-15 4 views
0

Я пытаюсь создать форму для приложения. Форма содержит два поля edittext и кнопку отправки. В любом случае, я получаю сообщение «Метод getText должен быть вызван из потока ui» в doInBackground().Android Studio Метод gettext должен быть вызван из потока ui, который в настоящее время выводит поток, является рабочим

Это мой код:

package com.example.jinson.myapplication; 
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 android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.view.View; 
import android.support.design.widget.NavigationView; 
import android.support.v4.view.GravityCompat; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.EditText; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

public class SubmitUname extends AppCompatActivity { 

private EditText editTextName; 
private EditText editTextUname; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
// TODO Auto-generated method stub 
super.onCreate(savedInstanceState); 
setContentView(R.layout.submit_uname); 

editTextName = (EditText) findViewById(R.id.editName); 
editTextUname = (EditText) findViewById(R.id.editUserName); 


Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
setSupportActionBar(toolbar); 
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
     this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
drawer.setDrawerListener(toggle); 
toggle.syncState(); 
} 

public void insert(View view){ 
    String name = editTextName.getText().toString(); 
    String uname = editTextUname.getText().toString(); 
    insertToDatabase(name,uname); 
} 

private void insertToDatabase(String name, String uname){ 
    class SendPostReqAsyncTask extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... params) { 

    String paramUsername = params[0]; 
    String paramAddress = params[1]; 


     String name = editTextName.getText().toString(); 
     String uname = editTextUname.getText().toString(); 

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

    try { 
     HttpClient httpClient = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost(
       "http://localhost/insert-db.php"); 
     httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

     HttpResponse response = httpClient.execute(httpPost); 

     HttpEntity entity = response.getEntity(); 


    } catch (ClientProtocolException e) { 

    } catch (IOException e) { 

    } 

    return "success"; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
    super.onPostExecute(result); 
    } 
    } 
SendPostReqAsyncTask sendPostReqAsyncTask = new SendPostReqAsyncTask(); 
    sendPostReqAsyncTask.execute(name, uname); 
    } 

} 

Android студии говорит, что метод GetText() должен быть вызван из потока пользовательского интерфейса в инструкции: editTextName.getText() ToString();. и editTextUname.getText(). toString(); Возможные решения??

Я новичок в этом поле и, пожалуйста, дайте мне решение.

+1

Существует аналогичные вопросы в этом форуме. Может быть http://stackoverflow.com/questions/32568340/android-studio-error-method-gettext-must-be-called-from-the-ui-thread-curre, это поможет вам – Shriram

+0

, вы создаете класс внутри метод, вы должны создать SendPostReqAsyncTask вне метода.вы не можете получить доступ к компоненту пользовательского интерфейса в методе doInBackground. потому что этот метод работает в рабочем потоке. – USKMobility

+1

Вы уже передаете 'name' и' uname' и получаете доступ к тому, зачем вам снова использовать getText(). ToString() '? –

ответ

0

doInBackground метод не работает в потоке пользовательского интерфейса (main), поэтому вы не можете обновить или использовать getText() оттуда. Но хорошая новость заключается в том, что вы можете сделать эту обработку в методе onPostExecute().

EDIT

Хороший вариант может быть, извлечение значение вашего EditText до AsyncTask, а затем отправить его в конструктор SendPostReqAsyncTask.

+2

Это не отвечает на вопрос. – CommonsWare

+0

@CommonsWare: Как ваш ответ отличается от моего? –

+0

Вы отредактировали свой ответ после того, как я написал свой комментарий и после того, как написал свой ответ. Мой комментарий был для вашего первоначального ответа, который не касался проблем, изложенных в вопросе. – CommonsWare

1

Android студии говорит, что метод GetText() должен быть вызван из потока пользовательского интерфейса

Correct. Если пользователь поворачивает экран или иным образом вызывает изменение конфигурации, ваша активность может исчезнуть к тому моменту, когда вы вызываете этот код с doInBackground().

Возможные решения?

  • Добавьте конструктор SendPostReqAsyncTask и передать в любых значениях, что вам нужно в том, что, например, текст из EditText

  • Добавить сеттеры в SendPostReqAsyncTask и пройти в любых значений, которые вам нужно в их, как, например текст из EditText, перед вызовом execute() или executeOnExecutor()

Al так, обратите внимание:

  • HttpClient не рекомендуется в течение многих лет, был осуждаемых в Android 5.1, и был удален из SDK в Android 6,0 ​​

  • Используя вложенную реализацию класса от AsyncTask (как вы делаете с SendPostReqAsyncTask) приведет к утечке памяти, когда устройство подвергается изменению конфигурации (например, пользователь поворачивает устройство от портрета до пейзажа)