数据显示在 logcat 中,但不显示在文本视图中
Posted
技术标签:
【中文标题】数据显示在 logcat 中,但不显示在文本视图中【英文标题】:Data Show in logcat but not show in text view 【发布时间】:2015-02-25 08:23:09 【问题描述】:.. 我能做什么
这是我的日志
12-29 11:05:13.908:D/gralloc_goldfish(772):没有检测到 GPU 仿真的仿真器。 12-29 11:05:24.649: D/dalvikvm(772): GC_FOR_ALLOC 释放 195K,9% 释放 7439K/8135K,暂停 35ms,总共 38ms 12-29 11:05:26.458: D/dalvikvm(772): GC_CONCURRENT freed 229K, 10% free 7628K/8455K, paused 26ms+99ms,总共185ms 12-29 11:05:27.908: D/Create Response(772): "message":"登录成功。","success":1 12-29 11:05:28.598:I/Choreographer(772):跳过 52 帧!应用程序可能在其主线程上做了太多工作。 12-29 11:05:29.848: D/创建响应 (772): "3":"jmi.mohsin@gmail.com","2":"myname","1":"msnmsn","0 ":"8527801400","mobile_number":"8527801400","hint":"myname","email_id":"jmi.mohsin@gmail.com","password":"msnmsn" 12-29 11:05:29.848:I/JSON 解析(772):我的名字 12-29 11:05:29.878: W/System.err(772): android.view.ViewRootImpl$CalledFromWrongThreadException: 只有创建视图层次结构的原始线程才能接触其视图。 12-29 11:05:29.878: W/System.err(772): 在 android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4609) 12-29 11:05:29.878: W/System.err(772): 在 android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:835) 12-29 11:05:29.878: W/System.err(772): 在 android.view.View.requestLayout(View.java:15129) 12-29 11:05:29.878: W/System.err(772): 在 android.view.View.requestLayout(View.java:15129) 12-29 11:05:29.878: W/System.err(772): 在 android.view.View.requestLayout(View.java:15129) 12-29 11:05:29.888: W/System.err(772): 在 android.view.View.requestLayout(View.java:15129) 12-29 11:05:29.888: W/System.err(772): 在 android.view.View.requestLayout(View.java:15129) 12-29 11:05:29.888: W/System.err(772): 在 android.widget.TextView.checkForRelayout(TextView.java:6303) 12-29 11:05:29.888: W/System.err(772): 在 android.widget.TextView.setText(TextView.java:3547) 12-29 11:05:29.888: W/System.err(772): 在 android.widget.TextView.setText(TextView.java:3405) 12-29 11:05:29.888: W/System.err(772): 在 android.widget.TextView.setText(TextView.java:3380) 12-29 11:05:29.898: W/System.err(772): at com.example.phonebook.Welcome$loginAccess.doInBackground(Welcome.java:93) 12-29 11:05:29.898: W/System.err(772): at com.example.phonebook.Welcome$loginAccess.doInBackground(Welcome.java:1) 12-29 11:05:29.898: W/System.err(772): 在 android.os.AsyncTask$2.call(AsyncTask.java:287) 12-29 11:05:29.898: W/System.err(772): 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 12-29 11:05:29.898: W/System.err(772): 在 java.util.concurrent.FutureTask.run(FutureTask.java:137) 12-29 11:05:29.898: W/System.err(772): 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 12-29 11:05:29.908: W/System.err(772): 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 12-29 11:05:29.908: W/System.err(772): 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 12-29 11:05:29.908: W/System.err(772): 在 java.lang.Thread.run(Thread.java:856)这是我的欢迎活动
包 com.example.phonebook; 导入 java.util.ArrayList; 导入 java.util.List; 导入 org.apache.http.NameValuePair; 导入 org.apache.http.message.BasicNameValuePair; 导入 org.json.JSONObject; 导入android.app.Activity; 导入android.os.AsyncTask; 导入android.os.Bundle; 导入android.os.StrictMode; 导入android.util.Log; 导入 android.widget.TextView; 公共类欢迎扩展活动 // 私有 ProgressDialog pDialog; TextView jsonParsed1,DataShow,hint_data; JSONParser jsonParser = new JSONParser(); JSONParser jobj = new JSONParser(); 私有静态字符串 url = "http://192.168.1.10/android_connect/login_setup/show_data.php"; //private static final String about = "about"; // 私有静态最终字符串 TAG_SUCCESS="success"; // 私有静态最终字符串hint="hint"; @覆盖 protected void onCreate(Bundle savedInstanceState) StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() .penaltyLog().build()); super.onCreate(savedInstanceState); setContentView(R.layout.welcome); jsonParsed1=(TextView)findViewById(R.id.jsonParsed); DataShow=(TextView)findViewById(R.id.show_all_data); hint_data=(TextView)findViewById(R.id.hint_datafor_value); 字符串 abt = getIntent().getStringExtra("mobile_number"); //意图 i=getIntent(); //String abt=i.getStringExtra("mobile_number"); //System.out.println(abt); //jsonParsed1.setText(abt); 新的登录访问()。执行(); 类 loginAccess 扩展 AsyncTask TextView jsonParsed = (TextView) findViewById(R.id.jsonParsed); 私有字符串内容; 字符串输出数据 = ""; JSONObject jsonResponse; @覆盖 受保护的字符串doInBackground(字符串... arg0) 字符串 abt = getIntent().getStringExtra("mobile_number"); 列表参数 = new ArrayList(); params.add(new BasicNameValuePair("mobile_number", abt)); JSONObject json = jsonParser.makeHttpRequest(url,"POST", params); 内容 = json.toString(); Log.d("创建响应", Content); /****************** 开始解析响应 JSON 数据 *************/ 尝试 /****** 使用来自 JSON 字符串的名称/值映射创建一个新的 JSONObject。 ********/ jsonResponse = 新 JSONObject(内容); /******* 获取节点值 **********/ 字符串提示 = jsonResponse.optString("hint").toString(); OutputData += "节点:\n\n "+ 提示 +" "; Log.i("JSON 解析", 提示); /****************** 结束解析响应 JSON 数据 *************/ // jsonParsed.setText(OutputData); 捕捉(异常 e) e.printStackTrace(); 返回空值; 受保护的无效onPostExecute(无效未使用) // //JSONObject jsonResponse = null; // // /******* 获取节点值 **********/ // 字符串提示 = jsonResponse.optString("hint").toString(); // // 输出数据 += "节点:\n\n "+ 提示 +" "; // // Log.i("JSON 解析", 提示); // // /****************** 结束解析响应 JSON 数据 *************/ // // hint_data.setText(OutputData); jsonParsed.setText(OutputData);【问题讨论】:
【参考方案1】:像这样修改你的异步任务: 做 asynctask 的后台方法在非 UI 线程中运行,所以我们不能从 doInbackgroud 修改 ui 元素,所以我们必须返回该结果,以便结果将作为参数进入 postExecute 方法,然后我们可以修改 UI
package com.example.phonebook;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONObject;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.widget.TextView;
import com.afbb.animationtest.R;
public class Welcome extends Activity
TextView jsonParsed1,DataShow,hint_data;
TextView jsonParsed ;
JSONParser jsonParser = new JSONParser();
JSONParser jobj = new JSONParser();
private static String url = "http://192.168.1.10/android_connect/login_setup/show_data.php";
@Override
protected void onCreate(Bundle savedInstanceState)
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites().detectNetwork()
.penaltyLog().build());
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome);
jsonParsed1=(TextView)findViewById(R.id.jsonParsed);
DataShow=(TextView)findViewById(R.id.show_all_data);
hint_data=(TextView)findViewById(R.id.hint_datafor_value);
jsonParsed = (TextView) findViewById(R.id.jsonParsed);
String abt = getIntent().getStringExtra("mobile_number");
new loginAccess().execute();
class loginAccess extends AsyncTask<String,Void,JSONObject>
private String Content;
@Override
protected JSONObject doInBackground(String... arg0)
String abt = getIntent().getStringExtra("mobile_number");
List params = new ArrayList();
params.add(new BasicNameValuePair("mobile_number", abt));
JSONObject json = jsonParser.makeHttpRequest(url,"POST", params);
Content = json.toString();
Log.d("Create Response", Content);
/****************** Start Parse Response JSON Data *************/
try
JSONObject jsonResponse = new JSONObject(Content);
String hint = jsonResponse.optString("hint").toString();
return jsonResponse;
catch (Exception e)
e.printStackTrace();
return null;
protected void onPostExecute(JSONObject result)
//Parse and update the UI
jsonParsed.setText( OutputData );
i
【讨论】:
我如何在欢迎活动中显示这些数据.....??..不只显示一个数据 "3":"jmi.mohsin@gmail.com","2": "myname","1":"msnmsn","0":"8527801400","mobile_number":"8527801400","hint":"myname","email_id":"jmi.mohsin@gmail.com", "密码":"msnmsn" 你没有仔细检查我的代码,没有添加泛型,你没有向 postExecuted 返回任何值。 字符串提示 = jsonResponse.optString("hint").toString();字符串 email_id =jsonResponse.optString("email_id").toString(); OutputData += "节点:\n\n"+ 提示 +" "; Log.i("JSON 解析", 提示);返回提示; 捕捉(异常 e) e.printStackTrace(); 返回空值; protected void onPostExecute(String resutl) jsonParsed.setText( resutl );我必须显示提示,email_id 等。先生,我可以在这个活动中改变什么......?? 然后解析该结果在后执行。 先生,您能更改活动吗?我如何将所有内容放入执行后...。请先生,例如,当我设置在我的活动中时,您可以编辑您的答案,请先生【参考方案2】:jsonParsed.setText( OutputData );
您只需在hint_data.setText( OutputData );
行之后的onPostExecute
方法中添加上述行,您将获得完美的输出。
并从doInBackground
方法中删除jsonParsed.setText( OutputData );
行。
【讨论】:
我改变了你所说的,但数据并不完美......你能设置活动吗...... Deep Mehta Sir 编辑你喜欢说的问题 Log.i("JSON 解析", 提示);只需将这一行放在 jsonParsed.setText(OutputData); 之前的 onPostExecute 方法中即可线,你会得到我认为的解决方案。只需检查将这个日志放入 onPostExecute 方法后,您是否会在 logcat 中获取数据! 这行之后:Log.i("JSON parse", hint);在 onPostExecute 方法中,你在 logcat 中得到了什么?我想你会得到空白字符串! 是的,我会得到空白字符串......先生,你能在我的问题中编辑和更改这个......请先生【参考方案3】:从 doInBackground 方法中删除下面一行
jsonParsed.setText( OutputData );
你不能从主线程外触摸视图。
【讨论】:
以上是关于数据显示在 logcat 中,但不显示在文本视图中的主要内容,如果未能解决你的问题,请参考以下文章
Eclipse LogCat 显示系统消息但不显示测试我的应用程序的消息