2013-05-13 48 views
0

我是新來的android和我想解析URL使用json。我運行代碼時遇到異常,並且我的應用程序說不幸myapp已停止運行。我也發佈了我的logcat。我想讀
課程代碼:101,
課程名稱: 「blahblah」 提供
學期:第一學期,第二學期,第三學期如何解析給定代碼中的url以便根據代碼中定義的輸出進行讀取?

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLConnection; 
import java.util.ArrayList; 

import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.ResponseHandler; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.BasicResponseHandler; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.params.BasicHttpParams; 
import org.apache.http.params.HttpParams; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.app.ListActivity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

public class Compsci734MainActivity extends ListActivity { 

    AsyncTask<Void, Void, Void> mTask; 
    String jsonString; 

    //String url = "https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=50cent&count=2"; 

    String url = "http://redsox.tcs.auckland.ac.nz/734A/CSService.svc/courses"; 

    //Button b; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_compsci734_main); 
     //getActionBar().setDisplayHomeAsUpEnabled(true); 

     Button button = (Button) findViewById(R.id.btnFetch); 
     final TextView tv = (TextView) findViewById(R.id.txtView); 

     mTask = new AsyncTask<Void, Void, Void>() { 
      @Override 
      protected Void doInBackground(Void... params) { 
       try { 
        jsonString = getJsonFromServer(url); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void result) { 
       super.onPostExecute(result); 

       tv.setText(jsonString); 

      } 
     }; 

//  Button button =(Button) findViewById(R.id.btnFetch); 
//  TextView tv =(TextView) findViewById(R.id.txtView); 
     button.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       try { 
        String url = "http://redsox.tcs.auckland.ac.nz 
                /734A/CSService.svc/courses"; 
        HttpPost httppost = new HttpPost(url); 
        try { 
         HttpParams p = new BasicHttpParams(); 
         HttpClient httpclient = new DefaultHttpClient(p); 
         ResponseHandler<String> responseHandler = new 
                 BasicResponseHandler(); 
         String responseBody = httpclient.execute(httppost, 
           responseHandler); 
         JSONArray jArray = new JSONArray(responseBody); 
         String text=""; 
         for (int i = 0; i < jArray.length(); i++) { 
          JSONObject e = jArray.getJSONObject(i); 
           text = text + "Course ID : 
             "+e.getString("courseField")+"\n"; 
           text = text + "Course name : 
             "+e.getString("titleField")+"\n"; 
           text = text + "Semesters offered: 
             "+e.getString("semesterField")+"\n"; 
           //text = text + "Birthyear : 
           //  "+e.getString("birthyear")+"\n"; 
         } 
         Log.i(responseBody, text); 
         tv.setText(text); 
        } catch (ClientProtocolException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 

       } catch (Throwable t) { 
        Toast.makeText(getBaseContext(), "Request failed: " + 
             t.toString(), Toast.LENGTH_LONG).show(); 
        t.printStackTrace(); 
       }  


       //tv.setText(result); 
      } 
     }); 
    } 


    public static String getJsonFromServer(String url) throws IOException { 

     BufferedReader inputStream = null; 

     URL jsonUrl = new URL(url); 
     URLConnection dc = jsonUrl.openConnection(); 

     dc.setConnectTimeout(5000); 
     dc.setReadTimeout(5000); 

     inputStream = new BufferedReader(new InputStreamReader(
       dc.getInputStream())); 

     // read the JSON results into a string 
     String jsonResult = inputStream.readLine(); 
     return jsonResult; 
    } 

    } 

這裏是我的logcat:

05-13 16:27:16.375: I/dalvikvm(1040): threadid=3: reacting to signal 3 
05-13 16:27:16.585: E/dalvikvm(1040): Unable to open stack trace file '/data/anr/traces.txt': Is a directory 
05-13 16:27:16.585: D/AndroidRuntime(1040): Shutting down VM 
05-13 16:27:16.595: W/dalvikvm(1040): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 
05-13 16:27:16.605: E/AndroidRuntime(1040): FATAL EXCEPTION: main 
05-13 16:27:16.605: E/AndroidRuntime(1040): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.compsci_734p/com.example.compsci_734p.Compsci734MainActivity}: java.lang.RuntimeException: Binary XML file line #7: You must supply a layout_width attribute. 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.app.ActivityThread.access$600(ActivityThread.java:123) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.os.Looper.loop(Looper.java:137) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at java.lang.reflect.Method.invoke(Method.java:511) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at dalvik.system.NativeStart.main(Native Method) 
05-13 16:27:16.605: E/AndroidRuntime(1040): Caused by: java.lang.RuntimeException: Binary XML file line #7: You must supply a layout_width attribute. 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.content.res.TypedArray.getLayoutDimension(TypedArray.java:491) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.view.ViewGroup$LayoutParams.setBaseAttributes(ViewGroup.java:5318) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.view.ViewGroup$MarginLayoutParams.<init>(ViewGroup.java:5439) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.widget.LinearLayout$LayoutParams.<init>(LinearLayout.java:1776) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.widget.LinearLayout.generateLayoutParams(LinearLayout.java:1700) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.widget.LinearLayout.generateLayoutParams(LinearLayout.java:56) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:741) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.app.Activity.setContentView(Activity.java:1835) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at com.example.compsci_734p.Compsci734MainActivity.onCreate(Compsci734MainActivity.java:50) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.app.Activity.performCreate(Activity.java:4465) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
05-13 16:27:16.605: E/AndroidRuntime(1040):  ... 11 more 
05-13 16:27:16.885: I/dalvikvm(1040): threadid=3: reacting to signal 3 
05-13 16:27:16.885: I/dalvikvm(1040): Wrote stack traces to '/data/anr/traces.txt' 
05-13 16:27:17.155: I/dalvikvm(1040): threadid=3: reacting to signal 3 
05-13 16:27:17.165: I/dalvikvm(1040): Wrote stack traces to '/data/anr/traces.txt' 

回答

0

你在沒有layout_width的xml中有東西。一切都必須有layout_width和layout_height。

此外,我看到你的下一個問題 - NetworkOnMainthreadException。您正在使用onClick執行HTTP請求。你不能這樣做 - 你需要在另一個線程或AsyncTask中完成。

+0

嗯我如何定製我的Http請求代碼,使它在AsyncTask ??中。道歉我是新來的android。 – 2013-05-13 04:38:43

+0

我修復了xml文件的寬度和高度參數。但是,我到底需要把http客戶端塊? – 2013-05-13 04:50:23

+0

AsyncTask是一個類。它有3個主要功能--PreExecute首先發生,並在主線程上。 doInBackground是第二個,發生在另一個線程上。 onPostExecute發生在第3個主線程中。這使您可以在單獨的代碼中執行某些操作,並在主線程之前和之後運行代碼,例如更新UI。你所要做的就是編寫一個從AsyncTask派生的類並實現這3個函數。 – 2013-05-13 04:51:18

0

只要單擊不同的線程就可以了。關於網絡上的主要threatenxception。

button.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      new Thread(new Runnable(

try { 

String url = "http://redsox.tcs.auckland.ac.nz/734A/CSService.svc/courses"; 
       HttpPost httppost = new HttpPost(url); 
       try { 
        HttpParams p = new BasicHttpParams(); 
        HttpClient httpclient = new DefaultHttpClient(p); 
        ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
        String responseBody = httpclient.execute(httppost, 
          responseHandler); 
        JSONArray jArray = new JSONArray(responseBody); 
        String text=""; 
        for (int i = 0; i < jArray.length(); i++) { 
         JSONObject e = jArray.getJSONObject(i); 
          text = text + "Course ID : "+e.getString("courseField")+"\n"; 
          text = text + "Course name : "+e.getString("titleField")+"\n"; 
          text = text + "Semesters offered: "+e.getString("semesterField")+"\n"; 
          //text = text + "Birthyear : "+e.getString("birthyear")+"\n"; 
        } 
        Log.i(responseBody, text); 
        tv.setText(text); 
       } catch (ClientProtocolException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

      } catch (Throwable t) { 
       Toast.makeText(getBaseContext(), "Request failed: " + t.toString(), 
         Toast.LENGTH_LONG).show(); 
       t.printStackTrace(); 
      }  


      //tv.setText(result); 
     })); 

    }); 
+0

嗯你做了什麼? – 2013-05-13 04:42:48

+0

抱歉,由於錯誤按輸入我剛剛編輯的代碼 – 2013-05-13 04:43:34

+0

抱歉再次打擾你,但我看看這個網站上的asynctask定義和例子,我有點困惑。任何人都可以在這裏發佈異步類的一般框架。更何況,當我創建一個擴展asynctask類的子類,然後只允許最終或抽象修飾符。我訪問過的所有鏈接都使用了私人修改器 – 2013-05-13 05:18:22

0

謝謝人!!! :)我已經解決了它,並做出了一個列表視圖。這是我的工作代碼:

package com.example.compsci_734t; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.zip.GZIPInputStream; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.StatusLine; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 





import android.app.Activity; 
import android.app.ListActivity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 



public class People extends Activity{ 

     ArrayList<String> items = new ArrayList<String>(); 
     static InputStream is = null; 
     //private static String url = ""; 
     //private static String url = "http:..."; 
     private static String url = "http...."; 
     //URL requestUrl = new URL(url); 
     JSONArray people = null; 
     private static final String TAG_COURSES = "Courses"; 
     static JSONObject jObj = null; 
     static String json = ""; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.people); 
      new MyTasks().execute(); 
     } 


     private class MyTasks extends AsyncTask<URL, Void, JSONObject> { 

      @Override 
      protected JSONObject doInBackground(URL... urls) { 
       // return loadJSON(url); 
       try { 
        // defaultHttpClient 
        DefaultHttpClient httpClient = new DefaultHttpClient(); 
        //HttpPost httpPost = new HttpPost(url); 
        HttpGet httpGet = new HttpGet(url); 
        HttpResponse httpResponse = httpClient.execute(httpGet); 

        HttpEntity httpEntity = httpResponse.getEntity(); 
        is = httpEntity.getContent(); 

       } catch (UnsupportedEncodingException e) { 
        e.printStackTrace(); 
       } catch (ClientProtocolException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       try { 
       /*BufferedReader reader = new BufferedReader(new InputStreamReader(
         is, "UTF-8"), 8);*/ 
       InputStream inputStream = is; 
       GZIPInputStream input = new GZIPInputStream(inputStream); 
       InputStreamReader reader = new InputStreamReader(input); 
       BufferedReader in = new BufferedReader(reader); 
       StringBuilder sb = new StringBuilder(); 
       String line = null; 
       while ((line = in.readLine()) != null) { 
        sb.append(line); 
        //System.out.println(line); 
       } 
       is.close(); 
       json = sb.toString(); 
      } catch (Exception e) { 
       Log.e("Buffer Error", "Error converting result " + e.toString()); 
      } 

      // try parse the string to a JSON object 

      try { 

       JSONArray people = new JSONArray(json); 
       //JSONArray people = new JSONArray(json); 

       for (int i = 0; i < people.length(); i++) { 
        //System.out.println(courses.getJSONObject(i).toString()); 
        JSONObject p = people.getJSONObject(i); 

        // Storing each json item in variable 
        String person_id = p.getString("someString1"); 


        items.add(person_id); 

        /*Log.v("--", "People: \n" + "\n UPI: " + person_id);*/ 
       } 


       //jObj = new JSONObject(json); 
      } catch (JSONException e) { 
       Log.e("JSON Parser", "Error parsing data " + e.toString()); 
      } 

      // return JSON String 
      return jObj; 
      } 

      protected void onPostExecute(JSONObject json) { 
       ListView myListView = (ListView)findViewById(R.id.peopleList); 
       myListView.setAdapter(new ArrayAdapter(getApplicationContext(), android.R.layout.simple_list_item_1, items)); 
     } 
     }