android - android 中的 json 解析有些问题

标签 android json parsing

我是 android 初学者,尝试使用 json 获取 pnr 状态,这是我的代码,但无法正常工作,请帮助我。检查控制台时出现一些空异常,它说 doinbackground 方法中存在一些问题不明白它说的是什么......

public class Riki extends Activity {
    TextView httpStuff;
    HttpClient client;
    JSONObject json;    
    final static String URL = "http://www.railpnrapi.com/";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.httpexample);
        httpStuff = (TextView) findViewById(R.id.tvHttp);
        client = new DefaultHttpClient();       
        new Read().execute("tnum");
    }

    public JSONObject PNR(String username)
            throws ClientProtocolException, IOException, JSONException {
        StringBuilder url = new StringBuilder(URL);
        url.append(username);

        HttpGet get = new HttpGet(url.toString());
        HttpResponse r = client.execute(get);
        int status = r.getStatusLine().getStatusCode();
        httpStuff.setText(url);
        httpStuff.setText(status);
        if (status == 200) {
            HttpEntity e = r.getEntity();
            String data = EntityUtils.toString(e);
            JSONArray timeline = new JSONArray(data);
            JSONObject last = timeline.getJSONObject(0);
            return last;
        } else {
            Toast.makeText(Riki.this, "error", Toast.LENGTH_SHORT);
            return null;
        }
    }

    public class Read extends AsyncTask<String, Integer, String>{

        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub
            try {
                json = PNR("8506503026");
                return json.getString(params[0]);
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            // TODO Auto-generated method stub
            httpStuff.setText(result);
        }

    }
}


12-06 16:28:48.180: E/AndroidRuntime(2871): FATAL EXCEPTION: AsyncTask #2
12-06 16:28:48.180: E/AndroidRuntime(2871): java.lang.RuntimeException: An error occured while executing doInBackground()
12-06 16:28:48.180: E/AndroidRuntime(2871):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at java.lang.Thread.run(Thread.java:1019)
12-06 16:28:48.180: E/AndroidRuntime(2871): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
12-06 16:28:48.180: E/AndroidRuntime(2871):     at android.view.ViewRoot.checkThread(ViewRoot.java:3011)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at android.view.ViewRoot.requestLayout(ViewRoot.java:630)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at android.view.View.requestLayout(View.java:8268)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at android.view.View.requestLayout(View.java:8268)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at android.view.View.requestLayout(View.java:8268)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at android.view.View.requestLayout(View.java:8268)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at android.view.View.requestLayout(View.java:8268)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at android.widget.ScrollView.requestLayout(ScrollView.java:1289)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at android.view.View.requestLayout(View.java:8268)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at android.widget.TextView.checkForRelayout(TextView.java:5547)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at android.widget.TextView.setText(TextView.java:2730)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at android.widget.TextView.setText(TextView.java:2598)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at android.widget.TextView.setText(TextView.java:2573)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at com.example.coder.Riki.PNR(Riki.java:49)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at com.example.coder.Riki$Read.doInBackground(Riki.java:69)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at com.example.coder.Riki$Read.doInBackground(Riki.java:1)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
12-06 16:28:48.180: E/AndroidRuntime(2871):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)

最佳答案

您在 PNR() 中的某些 TextView 上调用 .setText(),然后从 doInBackground() 调用它们。 setText() 是一个 UI 操作,doInBackground() 不允许触及 UI 线程。

如果您想在 AsyncTask 中进行一些 UI 操作,您应该在 onPreExecute()onPostExecute() 中进行。

关于android - android 中的 json 解析有些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20421855/

相关文章:

ios - 我可以通过编程方式向 PDF 添加链接注释吗?

android - RecyclerView 适配器中的 LayoutInflater

java - 使用 Streaming API 和 Json Parser 进行 JSON 解析 - 混合模式

android - 如果没有 GoogleCredential.Builder,GoogleCredential 将无法构建

javascript - 如何对具有相似键的数据进行分组?

php - 如何使用 PHP 将原始 json 字符串存储在 cookie 中?

python - 在python中解析嵌套的xml

c - 如何使用负浮点进行 sscanf ?

android - Flutter:PlatformException(错误,无法找到包含 <path> 的已配置根目录,null)

android - Ajax 不能在使用 phonegap 的 Android 手机中工作