2017-01-01 13 views
5
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(); 
    } 
    } 
} 

tôi đã nhận một lỗi khi tôi nhấp thêm sinh viên trong androidKhông thể tạo xử lý bên trong chủ đề đó đã không được gọi Looper.prepare() 3

E/AndroidRuntime: Fatal EXCEPTION: AsyncTask # 1 Quy trình: com.example.lenovo.yuwilson, PID: 22199 java.lang.RuntimeException: Đã xảy ra lỗi khi thực hiện doInBackground() tại android.os.AsyncTask $ 3.done (AsyncTask.java:300) tại java. util.concurrent.FutureTask.finishCompletion (FutureTask.java:355) tại java.util.concurrent.Futur eTask.setException (FutureTask.java:222) tại java.util.concurrent.FutureTask.run (FutureTask.java:242) tại android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java:231) tại java .util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112) tại java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java WEBC87) tại java.lang.Thread.run (Thread.java:841) Gây ra bởi: java.lang.RuntimeException: Không thể tạo trình xử lý bên trong chuỗi chưa được gọi là Looper.prepare() tại android.os.Handler. (Handler.java:208) tại android.os.Handler. (Handler.java:122) tại android.widget.Toast $ TN. (Toast.java:341) tại android.w idget.Toast. (Toast.java:96) tại android.widget.Toast.makeText (Toast.java:245) tại com.example.lenovo.yuwilson.AddStudent.doInBackground (AddStudentActivity.java:94) at com .example.lenovo.yuwilson.AddStudent.doInBackground (AddStudentActivity.java:54) tại android.os.AsyncTask $ 2.call (AsyncTask.java:288) tại java.util.concurrent.FutureTask.run (FutureTask.java: 237) tại android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java:231) tại java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112) tại java.util.concurrent.ThreadPoolExecutor $ Worker .run (ThreadPoolExecutor.java WEBC87) tại java.lang.Thread.run (Thread.java:841)

Ai đó giúp tôi giải quyết?

+4

trùng lặp có thể xảy ra của [Không thể tạo xử lý bên trong chủ đề mà không được gọi là Looper.prepare()] (http://stackoverflow.com/questions/3875184/cant-create-handler-inside-thread-that-has-not-called-looper-prepare) –

+0

@Yu Wil Son Vui lòng xem xét chấp nhận một trong các câu trả lời dưới đây nếu nó đáp ứng yêu cầu của bạn – Lino

Trả lời

6

Bạn không thể có

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

bên trong phương pháp doInBackground. Toast.makeText(...) phải được thực hiện trong một chuỗi giao diện người dùng.

2

thử điều này:

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

Bạn cần phải gọi Toast.makeText(...) từ thread UI: vì giao dịch thread UI với chức năng giao diện người dùng liên quan không công nhân chủ đề

Các vấn đề liên quan