不能';t修复android中的未来任务异常
我对android编程相当陌生,我正在尝试编写一些代码,包括Httppost、Json、AsyncTask等。我遇到了一个错误,但无法修复不能';t修复android中的未来任务异常,android,json,multithreading,android-asynctask,http-post,Android,Json,Multithreading,Android Asynctask,Http Post,我对android编程相当陌生,我正在尝试编写一些代码,包括Httppost、Json、AsyncTask等。我遇到了一个错误,但无法修复 public void onClick(View v) { MainActivity.this.runOnUiThread(new Runnable() { public void run() { RequestLogInFromServer RL = new
public void onClick(View v) {
MainActivity.this.runOnUiThread(new Runnable() {
public void run() {
RequestLogInFromServer RL = new RequestLogInFromServer();
RL.execute().toString();
}
});
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public class RequestLogInFromServer extends
AsyncTask<Object, Object, Object> {
TextView txt = (TextView) findViewById(R.id.textView1);
EditText edt = (EditText) findViewById(R.id.editText1);
@Override
protected Object doInBackground(Object... params) {
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(
"http://shopstable.turkcell.com.tr/timmenu/getPerosConfig.do");
httpPost.setHeader("Content-type", "application/json");
try {
HttpResponse response = httpClient.execute(httpPost);
HttpEntity resEntity = response.getEntity();
is = resEntity.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
// strJson = null;
}
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(is, "UTF-8"), 8); // iso-8859-1 //
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "/n");
}
is.close();
strJson = sb.toString();
} catch (Exception e) {
}
try {
if (strJson != null) {
jObj = new JSONObject(strJson);
String text = jObj.get("masterPerosActive").toString();
edt.setText(text);
} else {
jObj = null;
}
} catch (JSONException e) {
}
return "Executed";
}
原因:android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图。。您正在从非UI线程对UI执行更改。这里至少有一行这样做了(在AsyncTask
doInBackground
中):
既然您使用的是AsyncTask,为什么不在onPostExecute()
方法中执行UI更改,以便RequestLogInServer
类将更改为(仅最后一行):
公共类RequestLogInFromServer扩展异步任务{
TextView txt=(TextView)findViewById(R.id.textView1);
EditText edt=(EditText)findViewById(R.id.editText1);
@凌驾
受保护对象doInBackground(对象…参数){
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(“http://shopstable.turkcell.com.tr/timmenu/getPerosConfig.do");
setHeader(“内容类型”、“应用程序/json”);
试一试{
HttpResponse response=httpClient.execute(httpPost);
HttpEntity当前性=response.getEntity();
is=resEntity.getContent();
}捕获(不支持的编码异常e){
e、 printStackTrace();
}捕获(客户端协议例外e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
//strJson=null;
}
试一试{
BufferedReader=新的BufferedReader(新的InputStreamReader(即“UTF-8”),8);//iso-8859-1//
StringBuilder sb=新的StringBuilder();
字符串行=null;
而((line=reader.readLine())!=null){
sb.追加(第+行“/n”);
}
is.close();
strJson=sb.toString();
}捕获(例外e){
}
试一试{
if(strJson!=null){
jObj=新的JSONObject(strJson);
字符串text=jObj.get(“masterPerosActive”).toString();
返回文本;
}否则{
jObj=null;
}
}捕获(JSONException e){
}
返回null;
}
受保护的void onPostExecute(字符串结果){
如果(结果!=null){
edt.setText(结果);
}否则{
//显示出错的消息/标签
}
}
}
我不太明白。我到底该怎么做?我想我必须更改此“AsyncTask”行?因为我们将“onPostExecute(Object result)”更改为“onPostExecute(String result)”,是的,你是对的,我没有注意到:)自己编辑了答案以反映这一点。因此类签名更改为:公共类RequestLogInFromServer扩展了异步任务
07-22 09:51:36.791: E/AndroidRuntime(13010): FATAL EXCEPTION: AsyncTask #1
07-22 09:51:36.791: E/AndroidRuntime(13010): java.lang.RuntimeException: An error occured while executing doInBackground()
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.os.AsyncTask$3.done(AsyncTask.java:299)
07-22 09:51:36.791: E/AndroidRuntime(13010): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
07-22 09:51:36.791: E/AndroidRuntime(13010): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
07-22 09:51:36.791: E/AndroidRuntime(13010): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
07-22 09:51:36.791: E/AndroidRuntime(13010): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
07-22 09:51:36.791: E/AndroidRuntime(13010): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
07-22 09:51:36.791: E/AndroidRuntime(13010): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
07-22 09:51:36.791: E/AndroidRuntime(13010): at java.lang.Thread.run(Thread.java:882)
07-22 09:51:36.791: E/AndroidRuntime(13010): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4634)
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:867)
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.view.ViewGroup.invalidateChild(ViewGroup.java:4066)
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.view.View.invalidate(View.java:10193)
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.widget.TextView.invalidateRegion(TextView.java:4375)
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.widget.TextView.invalidateCursor(TextView.java:4318)
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.widget.TextView.spanChange(TextView.java:7172)
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:8759)
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:979)
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:688)
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:588)
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.text.Selection.setSelection(Selection.java:76)
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.text.Selection.setSelection(Selection.java:87)
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:302)
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.widget.TextView.setText(TextView.java:3535)
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.widget.TextView.setText(TextView.java:3405)
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.widget.EditText.setText(EditText.java:80)
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.widget.TextView.setText(TextView.java:3380)
07-22 09:51:36.791: E/AndroidRuntime(13010): at com.example.test2.MainActivity$RequestLogInFromServer.doInBackground(MainActivity.java:113)
07-22 09:51:36.791: E/AndroidRuntime(13010): at android.os.AsyncTask$2.call(AsyncTask.java:287)
07-22 09:51:36.791: E/AndroidRuntime(13010): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-22 09:51:36.791: E/AndroidRuntime(13010): ... 5 more
07-22 09:51:36.851: W/IInputConnectionWrapper(13010): showStatusIcon on inactive InputConnection
07-22 09:53:22.261: D/ActivityThread(13141): handleResumeActivity now pri:0
07-22 09:53:22.261: D/ActivityThread(13141): handleResumeActivity set pri:0
07-22 09:53:27.531: W/dalvikvm(13141): threadid=11: thread exiting with uncaught exception (group=0x40d9a318)
07-22 09:53:27.561: E/AndroidRuntime(13141): FATAL EXCEPTION: AsyncTask #1
07-22 09:53:27.561: E/AndroidRuntime(13141): java.lang.RuntimeException: An error occured while executing doInBackground()
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.os.AsyncTask$3.done(AsyncTask.java:299)
07-22 09:53:27.561: E/AndroidRuntime(13141): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
07-22 09:53:27.561: E/AndroidRuntime(13141): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
07-22 09:53:27.561: E/AndroidRuntime(13141): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
07-22 09:53:27.561: E/AndroidRuntime(13141): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
07-22 09:53:27.561: E/AndroidRuntime(13141): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
07-22 09:53:27.561: E/AndroidRuntime(13141): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
07-22 09:53:27.561: E/AndroidRuntime(13141): at java.lang.Thread.run(Thread.java:882)
07-22 09:53:27.561: E/AndroidRuntime(13141): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4634)
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:867)
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.view.ViewGroup.invalidateChild(ViewGroup.java:4066)
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.view.View.invalidate(View.java:10193)
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.widget.TextView.invalidateRegion(TextView.java:4375)
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.widget.TextView.invalidateCursor(TextView.java:4318)
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.widget.TextView.spanChange(TextView.java:7172)
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:8759)
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:979)
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:688)
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:588)
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.text.Selection.setSelection(Selection.java:76)
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.text.Selection.setSelection(Selection.java:87)
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:302)
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.widget.TextView.setText(TextView.java:3535)
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.widget.TextView.setText(TextView.java:3405)
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.widget.EditText.setText(EditText.java:80)
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.widget.TextView.setText(TextView.java:3380)
07-22 09:53:27.561: E/AndroidRuntime(13141): at com.example.test2.MainActivity$RequestLogInFromServer.doInBackground(MainActivity.java:111)
07-22 09:53:27.561: E/AndroidRuntime(13141): at android.os.AsyncTask$2.call(AsyncTask.java:287)
07-22 09:53:27.561: E/AndroidRuntime(13141): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-22 09:53:27.561: E/AndroidRuntime(13141): ... 5 more
String text = jObj.get("masterPerosActive").toString();
edt.setText(text);
public class RequestLogInFromServer extends AsyncTask<Object, Object, String> {
TextView txt = (TextView) findViewById(R.id.textView1);
EditText edt = (EditText) findViewById(R.id.editText1);
@Override
protected Object doInBackground(Object... params) {
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("http://shopstable.turkcell.com.tr/timmenu/getPerosConfig.do");
httpPost.setHeader("Content-type", "application/json");
try {
HttpResponse response = httpClient.execute(httpPost);
HttpEntity resEntity = response.getEntity();
is = resEntity.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
// strJson = null;
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 8); // iso-8859-1 //
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "/n");
}
is.close();
strJson = sb.toString();
} catch (Exception e) {
}
try {
if (strJson != null) {
jObj = new JSONObject(strJson);
String text = jObj.get("masterPerosActive").toString();
return text;
} else {
jObj = null;
}
} catch (JSONException e) {
}
return null;
}
protected void onPostExecute(String result) {
if(result != null) {
edt.setText(result);
} else {
// show a message/label that something went wrong
}
}
}