无法在未调用 Looper.prepare()3 的线程内创建处理程序
Posted
技术标签:
【中文标题】无法在未调用 Looper.prepare()3 的线程内创建处理程序【英文标题】:Can't create handler inside thread that has not called Looper.prepare()3 【发布时间】:2017-05-15 19:52:09 【问题描述】: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(FutureTask.java:242) 在 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) 原因:java.lang.RuntimeException:无法在未调用 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)
有人帮我解决吗?
【问题讨论】:
Can't create handler inside thread that has not called Looper.prepare()的可能重复 @Yu Wil Son 如果满足您的要求,请考虑接受以下答案之一 【参考方案1】:你不能拥有
Toast.makeText(context, "Error Exception", Toast.LENGTH_SHORT).show();
在doInBackground
方法中。 Toast.makeText(...)
必须在 UI 线程中执行。
【讨论】:
【参考方案2】:试试这个:
runOnUiThread(new Runnable()
public void run()
Toast.makeText(context, "Error Exception", Toast.LENGTH_SHORT).show();
);
您需要从 UI 线程调用 Toast.makeText(...)
:因为 UI 线程处理的是 UI 相关函数而不是工作线程
【讨论】:
以上是关于无法在未调用 Looper.prepare()3 的线程内创建处理程序的主要内容,如果未能解决你的问题,请参考以下文章
无法在未调用 Looper.prepare() 的线程内创建处理程序
无法在未调用 Looper.prepare() 的线程内创建处理程序
无法在未调用 Looper.prepare()-Alertdialogbox 的线程内创建处理程序 [重复]
无法在未调用 Looper.prepare() Graphhopper 的线程内创建处理程序