2016-11-25 2 views
0

저는 AChartEngine을 처음 사용합니다. 원격 데이터베이스에서 JSON 데이터를 검색하고 AchartEngine Bar Chart에 연결하려고합니다. 데이터를 성공적으로 가져올 수 있습니다. 그러나 그래프에 연결하는 데 어려움이 있습니다. 차트에 내 데이터가 없습니다. 난 하드 코드 또는 임의의 숫자를 넣어, 차트에 표시하지만 데이터베이스에서 데이터를 포함하려고하면 빈 페이지를 보여줍니다. 나는 내 코드를 게시하고있다. 어떤 도움을 주시면 감사하겠습니다. "X"축에 날짜를 표시하고 "Y"축에 양을 표시하려고합니다. 여기AChartEngine이 원격 데이터베이스의 그래프를 표시하지 않습니다.

public class BarGraphActivity extends AppCompatActivity { 

private GraphicalView mChart; 
private TimeSeries transactionSeries; 
private XYMultipleSeriesDataset dataset; 
private XYSeriesRenderer transactionRenderer; 
private XYMultipleSeriesRenderer multiRenderer; 

//JSON node name 
private static final String TAG_TYPE = "type"; 
private static final String TAG_AMOUNT = "amount"; 
private static final String TAG_CATEGORY = "category"; 
private static final String TAG_DESC = "desc"; 
private static final String TAG_DATE = "date"; 
private static final String TAG_SUCCESS = "success"; 
static final String FETCH_URL = "my_url"; 


String amount = null; 
String desc = null; 
String type = null; 
String date = null; 
String category = null; 
ProgressDialog pDialog; 

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

    //showTransaction(); 
    //settingup bar chart 


    //start plotting chart 
    new ChartTask().execute(); 
} 

public void setupChart(){ 

    //creating an Timeseries for Transactions 
    transactionSeries = new TimeSeries("Transactions"); 

    //creating a dataset to hold each series 
    dataset = new XYMultipleSeriesDataset(); 
    //adding transactionseries to the dataset 
    dataset.addSeries(transactionSeries); 

    //Creating a XYMultipleSeriesRenderer to customize transaction series 
    transactionRenderer = new XYSeriesRenderer(); 
    transactionRenderer.setColor(Color.GREEN); 
    //transactionRenderer.setPointStyle(PointStyle.CIRCLE); 
    transactionRenderer.setFillPoints(true); 
    transactionRenderer.setLineWidth(4); 
    transactionRenderer.setDisplayChartValues(false); 

    // Creating a XYMultipleSeriesRenderer to customize the whole chart 
    multiRenderer = new XYMultipleSeriesRenderer(); 

    multiRenderer.setChartTitle("Transaction Trends"); 
    multiRenderer.setXTitle("Date"); 
    multiRenderer.setYTitle("Amount"); 
    //multiRenderer.setZoomButtonsVisible(true); 

    multiRenderer.setXAxisMin(0); 
    multiRenderer.setXAxisMax(10); 

    multiRenderer.setYAxisMin(0); 
    multiRenderer.setYAxisMax(10); 

    multiRenderer.setBarSpacing(2); 

    // Adding transactionRenderer to multipleRenderer 
    // Note: The order of adding dataseries to dataset and renderers to multipleRenderer 
    // should be same 
    multiRenderer.addSeriesRenderer(transactionRenderer); 

    // Getting a reference to LinearLayout of the bar graph activity Layout 
    LinearLayout chartContainer = (LinearLayout) findViewById(R.id.chart_container); 

    mChart = (GraphicalView) ChartFactory.getBarChartView(getBaseContext(), dataset, multiRenderer, BarChart.Type.DEFAULT); 

    // Adding the Line Chart to the LinearLayout 
    chartContainer.addView(mChart); 
} 

private class ChartTask extends AsyncTask<String, String, String> { 

    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(BarGraphActivity.this); 
     pDialog.setMessage("Loading data. Please wait..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(false); 
     pDialog.show(); 
    } 
    @Override 
    protected String doInBackground(String... String) { 
     //int i = 0; 
     //String[] amount = new String[]; 
     try { 
      URL url = new URL(FETCH_URL); 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.connect(); 

      int responsecode = urlConnection.getResponseCode(); 

      if(responsecode == HttpURLConnection.HTTP_OK){ 
       BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
       StringBuilder sb = new StringBuilder(); 
       String line; 
       while ((line = br.readLine()) != null){ 
        sb.append(line); 
       } 
       br.close(); 
       return sb.toString(); 
      } 

     } catch (ProtocolException e) { 
      e.printStackTrace(); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
     pDialog.dismiss(); 


    try { 
     //get JSONObject from JSONArray of String 
     JSONArray result = new JSONArray(s); 
     JSONObject jsonObject = null; 
     String[] values = new String[2]; 
     //loop through the array and break the JSONObject into String 
     for(int i = 0; i<result.length(); i++) { 

      jsonObject = result.getJSONObject(i); 
      amount = jsonObject.getString(TAG_AMOUNT); 
      desc = jsonObject.getString(TAG_DESC); 
      type = jsonObject.getString(TAG_TYPE); 
      //getting date as string from database 
      date = jsonObject.getString(TAG_DATE); 
      //System.out.println(date); 
      //write it in the db in a different format like Wednesday, July 12, 2016 12:00 PM 
      SimpleDateFormat readFormat = new SimpleDateFormat("EEEE, MMMM dd, yyyy hh:mm a"); 
      //SimpleDateFormat writeFormat = new SimpleDateFormat("MMMM dd, yyyy"); 

      //check it date string for null or empty string or else it will give Unparseable date: "" (at offset 0) error 
      if(!date.equalsIgnoreCase("")) { 
       try { 
        Date dt = readFormat.parse(date); //parse the date string in the read format 
        //String dtStr = writeFormat.format(dt); 

        //dt = writeFormat.parse(dtStr); 
        //System.out.println(dt); 
        Log.d("Date: ", date); 
        double amt = Double.valueOf(amount.replace(",", "")); 
        //System.out.println(amt); 
        Log.d("Amount: ", String.valueOf(amt)); 

        setupChart(); 
        transactionSeries.add(dt.getTime(),amt); 
        mChart.repaint(); 
       } catch (ParseException e) { 
        e.printStackTrace(); 
       } 
      } 
      else { 
       return; 
      } 
     } 

    } 
    catch (JSONException e){ 
     e.printStackTrace(); 
    } //catch (ParseException e) { 
     // e.printStackTrace(); 
    // } 

    } 

    // Plotting generated data in the graph 
    /**@Override 
    protected void onProgressUpdate(Object... values) { 
     transactionSeries.add((Double) values[0], (Double) values[1]); 
     mChart.repaint(); 
    }**/ 
} 

D/날짜를 자궁강 때 데이터가 모습입니다 :: 2015년 7월 29일 (수요일) 오전 1시 35분
D/금액 : 221.06
D/날짜 : 2015년 11월 25일 (수요일) 오후 3시 27분
D/금액 : 275.7

답변

0

여기서 "setupChart()"메서드는 asynctask "new ChartTask(). execute()"를 통해 webservice에서 값을 가져 오기 전에 호출 중입니다. 따라서 차트를 그릴 값을 얻지 못하거나 플로팅 후에 값을 얻는다고 말할 수 있습니다.

해결책 : asynctask onpostexecute에서 "setupChart()"메서드를 호출하십시오.

+0

나는 이것을했지만 여전히 차트가 보이지 않습니다. 데이터를 가져올 수는 있지만 차트는 여전히 비어 있습니다. – Shirin

관련 문제