Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare () 3

public class AddStudentActivity extends AppCompatActivity {

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

public void add2(View view){
    //create 3 editText  ,  1 Textview
    EditText et_name, et_age;
    RadioButton rb_male;
    TextView tv_msg;

    //bind with xml widget
    et_name = (EditText)findViewById(R.id.et_name);
    et_age = (EditText)findViewById(R.id.et_age);
    rb_male = (RadioButton)findViewById(R.id.rb_male);
    tv_msg = (TextView)findViewById(R.id.tv_msg);
    //retrieve values
    String name = et_name.getText().toString();
    String age = et_age.getText().toString();
    String gender = "";
    if (rb_male.isChecked())
        gender = "male";
    else
        gender = "female";
    //call php
    new AddStudent(this, tv_msg).execute(name, age, gender);
   }
}

class AddStudent extends AsyncTask<String, Void, String> {
private Context context;
//CHANGE HERE....ADD PARAMATER
TextView tv_msg;

public AddStudent(Context context,TextView tv_msg) {
    this.context = context;
    this.tv_msg = tv_msg;

}

@Override
protected String doInBackground(String[] arg) {
    //CHANGE HERE ...... RETRIEVE STRING ARGUMENTS
   String name = arg[0];
    String age = arg[1];
    String gender = arg[2];

    String link;
    String data;
    BufferedReader bufferedReader;
    String result;

    try {
        //CHANGE HERE .... PARAMETERS
          data = "?name=" + URLEncoder.encode(name, "UTF-8");
        data += "&age="+ URLEncoder.encode(age, "UTF-8");
        data += "&gender="+ URLEncoder.encode(gender, "UTF-8");
        //CHANGE HERE .... PHP PAGE
          link = "http://10.0.2.2/fashionstudio/ADD3.php" + data;

        URL url = new URL(link);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();

        bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
        result = bufferedReader.readLine();

        return result;
    } catch (Exception e) {
        Log.d("msg here", e.getMessage());
        Toast.makeText(context, "Error Exception", Toast.LENGTH_SHORT).show();
        return new String("Exception: " + e.getMessage());

    }
}

@Override
protected void onPostExecute(String result) {
    if (result != null) {
        try {
            JSONObject reader = new JSONObject(result);
            //CHANGE HERE... RETRIEVE VALUES
            String msg = reader.getString("msg");
            tv_msg.setText(msg);
        } catch (Exception e) {
            e.printStackTrace();
            Log.d("msg here", e.getMessage());
            Toast.makeText(context, "Error parsing JSON data.", Toast.LENGTH_SHORT).show();
        }
    } else {
        Toast.makeText(context, "Couldn't get any JSON data.", Toast.LENGTH_SHORT).show();
    }
  }
}

у меня появляется ошибка, когда я нажимаю добавить студента в android

E / AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: AsyncTask # 1 Процесс: com.example.lenovo.yuwilson, PID: 22199 java.lang.RuntimeException: произошла ошибка при выполнении doInBackground () в android.os.AsyncTask $ 3.done (AsyncTask.java : 300) в java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:355) в java.util.concurrent.FutureTask.setException (FutureTask.java:222) в java.util.concurrent.FutureTask.run. java: 242) в android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java:231) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112) в java.util.concurrent.Thread run (ThreadPoolExecutor.java:587) в java.lang.Thread.run (Thread.java:841) Вызвано: java.lang.RuntimeException: Can't cr eate внутри потока, который не вызвал Looper.prepare () в android.os.Handler. (Handler.java:208) в android.os.Handler. (Handler.java:122) в android.widget.Toast $ TN. (Toast.java:341) на android.widget.Toast. (Toast.java:96) на android.widget.Toast.makeText (Toast.java:245) на com.example.lenovo.yuwilson.AddStudent.doInBackground (AddStudentActivity .java: 94) на com.example.lenovo.yuwilson.AddStudent.doInBackground (AddStudentActivity.java:54) на android.os.AsyncTask $ 2.call (AsyncTask.java:288) на java.util.concurrent.FutureTask.run (FutureTask.java:237) в android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java:231) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:587) в java.lang.Thread.run (Thread.java:841)

Кто-нибудь помогите мне решить, пожалуйста?


person Yu Wil Son    schedule 01.01.2017    source источник
comment
Возможный дубликат Невозможно создать обработчик внутри потока который не вызвал Looper.prepare ()   -  person K Neeraj Lal    schedule 01.01.2017
comment
@Yu Wil Son Пожалуйста, примите решение принять один из приведенных ниже ответов, если он соответствует вашему запросу.   -  person Lino    schedule 02.01.2017


Ответы (2)


Ты не можешь иметь

Toast.makeText(context, "Error Exception", Toast.LENGTH_SHORT).show();

внутри метода doInBackground. Toast.makeText(...) должен выполняться в потоке пользовательского интерфейса.

person Lino    schedule 01.01.2017

попробуй это:

runOnUiThread(new Runnable() {
  public void run() {
    Toast.makeText(context, "Error Exception", Toast.LENGTH_SHORT).show();
  }
});

Вам нужно вызвать Toast.makeText(...) из потока пользовательского интерфейса: поскольку поток пользовательского интерфейса имеет дело с функцией, связанной с пользовательским интерфейсом, а не с рабочим потоком

person rafsanahmad007    schedule 01.01.2017