2015-03-25 59 views
-1

我是新來的當我連接到服務器以使用來自url的數據到android API 4.4.2中的繪圖圖表時,我有這個錯誤。我嘗試修復這個錯誤,但我不能請告訴我如何解決這個錯誤java.lang.ArrayIndexOutOfBoundsException:length = 1; index = 1如何修復它

這裏,這是我的代碼

results = new ArrayList<Result>(); 
     new JSONAsyncTask().execute("http://phm.umr-lab.com/getdata1.php"); 

class JSONAsyncTask extends AsyncTask<String, Void, Boolean> { 

     ProgressDialog dialog; 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      dialog = new ProgressDialog(MainActivity.this); 
      dialog.setMessage("Loading, please wait"); 
      dialog.setTitle("Connecting server"); 
      dialog.show(); 
      dialog.setCancelable(false); 
     } 

     @Override 
     protected Boolean doInBackground(String... urls) { 


      try { 

       //------------------>> 
       HttpGet httppost = new HttpGet(urls[0]); 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpResponse response = httpclient.execute(httppost); 

       // StatusLine stat = response.getStatusLine(); 
       int status = response.getStatusLine().getStatusCode(); 

       if (status == 200) { 
        HttpEntity entity = response.getEntity(); 
        String data = EntityUtils.toString(entity); 


        JSONObject jsono = new JSONObject(data); 
        JSONArray jarray = jsono.getJSONArray("result"); 

        for (int i = 0; i < jarray.length(); i++) { 
         JSONObject object = jarray.getJSONObject(i); 
         Day = object.getString("Day"); 
         pH = Float.parseFloat(object.getString("pHdata")); 
        } 

        Date.add(Day); 
        ph.add(pH); 
        return true; 
       } 

       //------------------>> 

      } catch (ParseException e1) { 
       e1.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      return false; 
     } 

     protected void onPostExecute(Boolean result) { 
      super.onPostExecute(result); 
      dialog.cancel(); 
      if(result == false) 
       Toast.makeText(getApplicationContext(), "Unable to fetch data from server", Toast.LENGTH_LONG).show(); 

     } 
    } 
     private void openChart(){ 
     int[] x = {0,1,2,3,4,5,6,7 }; 
     Float[] bar = ph.toArray(new Float[Date.size()]); 
     String[] Datr = Date.toArray(new String[Date.size()]); 
     // Creating an XYSeries for Income 
     //CategorySeries incomeSeries = new CategorySeries("Income"); 
     XYSeries incomeSeries = new XYSeries("Data"); 
     // Creating an XYSeries for Income 
     for(int i=0;i<x.length;i++){    
      incomeSeries.add(i,bar[i]); 
     } 
     // Creating a dataset to hold each series 
     XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset(); 
     // Adding Income Series to the dataset 
     dataset.addSeries(incomeSeries);  
     // Creating XYSeriesRenderer to customize incomeSeries 
     XYSeriesRenderer incomeRenderer = new XYSeriesRenderer(); 
     incomeRenderer.setColor(Color.rgb(130, 130, 230)); 
     incomeRenderer.setFillPoints(true); 
     incomeRenderer.setLineWidth(2); 
     incomeRenderer.setDisplayChartValues(true); 
     // Creating a XYMultipleSeriesRenderer to customize the whole chart 
     XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer(); 
     multiRenderer.setXLabels(0); 
     multiRenderer.setChartTitle("pHdata"); 
     multiRenderer.setXTitle("pH 1-14"); 
     multiRenderer.setYTitle("Date"); 
     multiRenderer.setZoomButtonsVisible(true);    
     for(int i=0; i< x.length;i++){ 
      multiRenderer.addXTextLabel(i, Datr[i]);    
     }  
     // Adding incomeRenderer and expenseRenderer to multipleRenderer 
     // Note: The order of adding dataseries to dataset and renderers to multipleRenderer 
     // should be same 
     multiRenderer.addSeriesRenderer(incomeRenderer); 
     // Creating an intent to plot bar chart using dataset and multipleRenderer  
     Intent intent = ChartFactory.getBarChartIntent(getBaseContext(), dataset, multiRenderer, Type.DEFAULT); 
     // Start Activity 
     startActivity(intent); 

,這是我的錯誤

threadid=1: thread exiting with uncaught exception(group=0x430d4140) 
FATAL EXCEPTION: main 
Process: in.wptrafficanalyzer.achartenginebarchart, PID: 15991 
java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 
    at in.wptrafficanalyzer.achartenginebarchart.MainActivity.openChart(MainActivity.java:164) 
    at in.wptrafficanalyzer.achartenginebarchart.MainActivity.access$0(MainActivity.java:151) 
    at in.wptrafficanalyzer.achartenginebarchart.MainActivity$1.onClick(MainActivity.java:66) 
    at android.view.View.performClick(View.java:4487) 
    at android.view.View$PerformClick.run(View.java:18746) 
at android.os.Handler.handleCallback(Handler.java:733) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:149) 
    at android.app.ActivityThread.main(ActivityThread.java:5077) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609) 
    at dalvik.system.NativeStart.main(Native Method) 
+1

@GeorgeThomas有我 2015-03-25 12:58:19

+1

問題發生在這些行之一multiRenderer.addXTextLabel(我,Datr [i]); incomeSeries.add(I,巴[I]);.檢查Datr和bar數組,它們與x數組長度相同或更長。 – 2015-03-25 12:59:38

+0

我將發佈答案,因爲答案是很長的評論 – 2015-03-25 13:10:56

回答

0

你有在你的代碼

首先幾個問題是在這裏:

for (int i = 0; i < jarray.length(); i++) { 
     JSONObject object = jarray.getJSONObject(i); 
     Day = object.getString("Day"); 
     pH = Float.parseFloat(object.getString("pHdata")); 
} 
Date.add(Day); 
ph.add(pH); 

當您按照上面所示的方式執行此操作時,您始終只添加json中的最後一個元素。如果你想添加的JSON的所有元素必須調用循環

for (int i = 0; i < jarray.length(); i++) { 
     JSONObject object = jarray.getJSONObject(i); 
     Date.add(object.getString("Day")); 
     ph.add(Float.parseFloat(object.getString("pHdata")); 
} 

第二個問題是在openChart()方法的內部add方法。你像下面這樣:

int[] x = {0,1,2,3,4,5,6,7 }; 
Float[] bar = ph.toArray(new Float[Date.size()]); 
String[] Datr = Date.toArray(new String[Date.size()]); 
... 

for(int i=0;i<x.length;i++){    
    incomeSeries.add(i,bar[i]); 
} 

... 
for(int i=0;i<x.length;i++){    
     multiRenderer.addXTextLabel(i, Datr[i]) 
} 

你從來沒有檢查X數組具有相同或最大長度爲barDatr陣列 - 這是非常危險的。你應該這樣做:

int[] x = {0,1,2,3,4,5,6,7 }; 
Float[] bar = ph.toArray(new Float[Date.size()]); 
String[] Datr = Date.toArray(new String[Date.size()]); 
... 
int firstSize = Math.min(x.length, bar.length); 
for(int i=0;i<firstSize;i++){    
    incomeSeries.add(i,bar[i]); 
} 

... 
int secondSize = Math.min(x.length, Datr.length); 
for(int i=0;i<secondSize;i++){    
     multiRenderer.addXTextLabel(i, Datr[i]) 
} 

現在你的解決方案將是安全的。

相關問題