2015-09-17 44 views
0

我想解析json数据,在arraylist中添加并将其传递给listview。但是当我尝试使用Arraylist.add在android AsyncTask doInBackground函数中添加项目到列表中时,它不起作用。当我尝试从列表中读取数据时,屏幕崩溃。Android Arraylist.add不工作AsyncTask

public class QueueManagement extends Activity { 

    String queueUrl = "http://dev.woofyz.com/api/pet/queue"; 

    ListView list; 
    ArrayList<String> petImage = new ArrayList<String>(); 
    ArrayList<String> petName = new ArrayList<String>(); 
    ArrayList<String> petSpecie = new ArrayList<String>(); 
    ArrayList<String> petBreed = new ArrayList<String>(); 
    ArrayList<String> petAge = new ArrayList<String>(); 
    ArrayList<String> petOwner = new ArrayList<String>(); 
    ArrayList<String> petToken = new ArrayList<String>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.queue_layout); 

     //TOP MENU 
     CustomActionBar customAactionBar = new CustomActionBar(QueueManagement.this); 
     ActionBar actionBar = customAactionBar.getActionBar(); 
     actionBar.setCustomView(R.layout.custom_queue_menu); 

     //SETTING VALUE IN NAV SPINNER 
     MenuSpinner mspinner = new MenuSpinner(QueueManagement.this); 
     ArrayAdapter dataAdapter = mspinner.getQueueSpinner(); 
     Spinner spinner = (Spinner) findViewById(R.id.righttext); 
     spinner.setAdapter(dataAdapter); 

     //MAKE DOCTOR PROFILE CIRCULAR 
     ImageView imageView = (ImageView) findViewById(R.id.doctorProfilepic); 
     Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.doctor); 
     RoundImage roundImage = new RoundImage(); 
     Bitmap circle = roundImage.getRoundImage(bitmap); 
     imageView.setImageBitmap(circle); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     new AsyncCaller().execute(); 
    } 

    private class AsyncCaller extends AsyncTask<Void, Void, Void> { 
     ProgressDialog pdLoading = new ProgressDialog(QueueManagement.this); 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pdLoading.setMessage("\tLoading..."); 
      pdLoading.show(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 

      JsonParser jParser = new JsonParser(); 
      JSONArray json = jParser.getJsonFromUrl(queueUrl); 

      for (int i = 0; i < json.length(); i++) { 
       try { 
        JSONObject jo = json.getJSONObject(i); 
        //petImage.add(jo.getString("image")); 
        petName.add(jo.getString("name")); 
        //petSpecie.add(jo.getString("species")); 
        //petBreed.add(jo.getString("breed")); 
        //petAge.add(jo.getString("age")); 
        //petOwner.add(jo.getString("owner")); 
        //petToken.add(jo.getString("token")); 
       }catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      pdLoading.dismiss(); 
      CustomQueueListview adapter = new CustomQueueListview(QueueManagement.this,petImage,petName,petSpecie,petBreed,petAge,petOwner,petToken); 
      list=(ListView)findViewById(R.id.queuelist); 
      list.setAdapter(adapter); 
     } 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     // INFLATE THE MENU 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.queue_menu, menu); 
     return true; 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 

     TextView name = (TextView) findViewById(R.id.doctorname); 
     name.setText(petName.get(0)); 

     //FILTER ClICK 
     ImageView filter = (ImageView) findViewById(R.id.filter); 
     filter.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View myView){ 
       CustomPopup popup = new CustomPopup(QueueManagement.this); 
       popup.getFilterPopup(); 
      } 
     }); 

     //SENDNEXT ClICK 
     Button sendNext = (Button) findViewById(R.id.sendnext); 
     sendNext.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View myView){ 
       Intent intent = new Intent(QueueManagement.this, PetProfile.class); 
       startActivity(intent); 
      } 
     }); 
    } 

} 

这里是我的JSON解析器代码

public class JsonParser { 

    static InputStream is = null; 
    static JSONArray jarray = null; 
    static String json = ""; 

    public JsonParser() { 

    } 

    public JSONArray getJsonFromUrl(String url) { 

     try { 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpGet httpPost = new HttpGet(url); 
      HttpResponse httpResponse = httpClient.execute(httpPost); 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      is = httpEntity.getContent();  
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 


     try { 

      BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line); 
      } 
      is.close(); 
      json = sb.toString(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     // try parse the string to a JSON ARRAY 
     try { 
      jarray = new JSONArray(json); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     // return JSON ARRAY 
     return jarray; 
    } 

} 

这里是我的logcat

E/AndroidRuntime(13507): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2198) 
E/AndroidRuntime(13507): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257) 
E/AndroidRuntime(13507): at android.app.ActivityThread.access$800(ActivityThread.java:139) 
E/AndroidRuntime(13507): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210) 
E/AndroidRuntime(13507): at android.os.Handler.dispatchMessage(Handler.java:102) 
E/AndroidRuntime(13507): at android.os.Looper.loop(Looper.java:136) 
E/AndroidRuntime(13507): at android.app.ActivityThread.main(ActivityThread.java:5086) 
E/AndroidRuntime(13507): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(13507): at java.lang.reflect.Method.invoke(Method.java:515) 
E/AndroidRuntime(13507): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
E/AndroidRuntime(13507): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
E/AndroidRuntime(13507): at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime(13507): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
E/AndroidRuntime(13507): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
E/AndroidRuntime(13507): at java.util.ArrayList.get(ArrayList.java:308) 
E/AndroidRuntime(13507): at org.woofyz.QueueManagement.onStart(QueueManagement.java:145) 
E/AndroidRuntime(13507): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1194) 
E/AndroidRuntime(13507): at android.app.Activity.performStart(Activity.java:5258) 
E/AndroidRuntime(13507): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2171) 
E/AndroidRuntime(13507): ... 11 more 
E/cutils ( 245): Failed to mkdirat(/storage/sdcard1/Android): Read-only file system 
E/chromium(16926): [ERROR:simple_index_file.cc(223)] Failed to write the temporary index file 
E/chromium(16926): [ERROR:simple_index_file.cc(223)] Failed to write the temporary index file 
E/chromium_android_linker(13558): Open: Could not open libchrome.so: Could not map at 0x54b7f000 requested, backing out 
E/chromium_android_linker(13558): Unable to load library: libchrome.so 
E/libEGL (13558): validate_display:254 error 3008 (EGL_BAD_DISPLAY) 
E/libEGL (13558): validate_display:254 error 3008 (EGL_BAD_DISPLAY) 
E/OMXMaster(13558): A component of name 'OMX.qcom.audio.decoder.aac' already exists, ignoring this one. 
E/cutils ( 245): Failed to mkdirat(/storage/sdcard1/Android): Read-only file system 
E/NetworkScheduler.SchedulerReceiver(1351): Invalid parameter app 
E/NetworkScheduler.SchedulerReceiver(1351): Invalid package name : Perhaps you didn't include a PendingIntent in the extras? 
E/AuthorizationBluetoothService(1351): Proximity feature is not enabled. 
E/AuthorizationBluetoothService(1351): Proximity feature is not enabled. 
E/dalvikvm(13849): Could not find class 'android.telecom.TelecomManager', referenced from method com.google.android.gms.wearable.service.y.a 
E/MDM  (1237): [79] b.run: Couldn't connect to Google API client: ConnectionResult{statusCode=API_UNAVAILABLE, resolution=null} 
E/MDM  (1237): [79] b.run: Couldn't connect to Google API client: ConnectionResult{statusCode=API_UNAVAILABLE, resolution=null} 
E/ActivityThread(13818): Failed to find provider info for com.facebook.katana.provider.AttributionIdProvider 
E/ActivityThread(13818): Failed to find provider info for com.facebook.katana.provider.AttributionIdProvider 
E/dalvikvm(13898): Could not find class 'android.app.Notification$Action$Builder', referenced from method g.a 
E/dalvikvm(13898): Could not find class 'android.app.RemoteInput$Builder', referenced from method g.a 
E/dalvikvm(13898): Could not find class 'android.app.Notification$Action$Builder', referenced from method g.a 
E/dalvikvm(13898): Could not find class 'android.text.style.TtsSpan', referenced from method g.a 
E/dalvikvm(13898): Could not find class 'ax', referenced from method g.a 
E/dalvikvm(13898): Could not find class 'az', referenced from method g.a 
E/dalvikvm(13898): Could not find class 'android.app.RemoteInput[]', referenced from method g.a 
E/dalvikvm(13898): Could not find class 'com.google.android.apps.hangouts.telephony.TeleConnectionService', referenced from method g.l 
E/dalvikvm(13898): Could not find class 'android.telecom.TelecomManager', referenced from method g.n 
E/SQLiteLog(13898): (1) no such table: mmsconfig 
E/Babel_SMS(13898): canonicalizeMccMnc: invalid mccmnc nullnull 
E/dalvikvm(13898): Could not find class 'fzc', referenced from method com.google.android.libraries.hangouts.video.sdk.ScreenVideoCapturer.<init> 
E/dalvikvm(13898): Could not find class 'android.telecom.PhoneAccount$Builder', referenced from method dry.f 
E/dalvikvm(13898): Could not find class 'android.telecom.TelecomManager', referenced from method dry.i 
E/chromium(16926): [ERROR:simple_index_file.cc(223)] Failed to write the temporary index file 
E/chromium(16926): [ERROR:simple_index_file.cc(223)] Failed to write the temporary index file 
E/libEGL (13974): validate_display:254 error 3008 (EGL_BAD_DISPLAY) 
E/libEGL (13974): validate_display:254 error 3008 (EGL_BAD_DISPLAY) 
E/OMXMaster(13974): A component of name 'OMX.qcom.audio.decoder.aac' already exists, ignoring this one. 
E/MDMCTBK ( 583): MdmCutbackHndler,Could not open '' 
E/MDMCTBK ( 583): MdmCutbackHndler,Could not open '' 
E/audio_a2dp_hw( 260): adev_set_parameters: ERROR: set param called even when stream out is null 
E/chromium(16926): [ERROR:simple_index_file.cc(223)] Failed to write the temporary index file 
E/chromium(16926): [ERROR:get_updates_processor.cc(243)] PostClientToServerMessage() failed during GetUpdates 
E/pIntent (18302): started scanning called 
E/MDMCTBK ( 583): MdmCutbackHndler,Could not open '' 
E/MDMCTBK ( 583): MdmCutbackHndler,Could not open '' 
E/WakeLock(13053): callingPackage is not supposed to be empty for wakelock Config Service fetch! 
E/pIntent (18302): started scanning called 
+1

为什么不创建一个模型类的getter和setter,然后使用对象的名单。 – Raghunandan

+0

'IndexOutOfBoundsException' –

+0

我想我在做保护作为错误doInBackground(Void ... params)错误,这就是为什么list.add不工作 –

回答

0

用于解析JSON对象,我们将创造一流的JSONObject的对象,并指定一个包含字符串JSON数据。它的语法是:

String in; 
JSONObject reader = new JSONObject(in); 

最后一步是解析JSON。一个JSON文件由具有不同键/值对e.t.c的不同对象组成。所以JSONObject有一个独立的函数来解析JSON文件的每个组件。其语法如下:

JSONObject sys = reader.getJSONObject("sys"); 
country = sys.getString("country"); 

JSONObject main = reader.getJSONObject("main"); 
temperature = main.getString("temp"); 

getJSONObject方法返回JSON对象。方法getString返回指定键的字符串值。

和教程,你可以see

+0

'JSONArray json = jParser.getJsonFromUrl(queueUrl); (int i = 0; i

+0

可否请您在此发布您的json响应。 –