在asynctask中执行doInBackground时发生错误

时间:2014-06-22 03:22:11

标签: android json android-asynctask achartengine

我使用Aynctask进行API调用,使用blockchain.info API和Android achartengine Library构建比特币值图表。

通过deugging我看到API调用成功并且JSON数据被拉出,但由于某种原因它崩溃并且LogCat给我错误"执行doInBackground时发生错误。我知道你无法访问doInBackground中的UI元素,但我没有尝试这样做,所以有人知道这里可能有什么问题吗?

public class GraphActivity extends Activity {

private GraphicalView m_chart;

private XYMultipleSeriesDataset m_dataset = new XYMultipleSeriesDataset();

private XYMultipleSeriesRenderer m_renderer = new XYMultipleSeriesRenderer();

private XYSeries m_currentSeries;

private XYSeriesRenderer m_currentRenderer;

private void initChart()
{
    m_currentSeries = new XYSeries("Bitcoin Price");
    m_dataset.addSeries(m_currentSeries);
    m_currentRenderer = new XYSeriesRenderer();
    m_renderer.addSeriesRenderer(m_currentRenderer);
}

private void addBtcPriceData(xyCoords[] coords)
{
    int length = coords.length;
    for(int i = 0; i < length; ++i)
    {
        m_currentSeries.add(coords[i].x, coords[i].y);
    }
}

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

@Override
protected void onResume()
{
    super.onResume();
    new RetrieveBTCChartTask().execute("https://blockchain.info/charts/market-price?format=json");
    /*LinearLayout layout = (LinearLayout) findViewById(R.id.chart);
    if(m_chart == null)
    {
        initChart();
        addSampleData();
        m_chart = ChartFactory.getCubeLineChartView(this,m_dataset, m_renderer, 0.3f);
        layout.addView(m_chart);
    }
    else
    {
        m_chart.repaint();
    }*/
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.graph, menu);
    return true;
}

class RetrieveBTCChartTask extends AsyncTask<String, Void, xyCoords[]>
{
    @Override
    protected xyCoords[] doInBackground(String... urls)
    {
        HttpClient httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet(urls[0]);

        httpget.setHeader("Content-type", "application/json");
        //httppost.setHeader("qty", "1");

        InputStream inputStream = null;
        String result = null;

        try
        {
            HttpResponse response = httpclient.execute(httpget);
            HttpEntity entity = response.getEntity();

            inputStream = entity.getContent();

            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
            StringBuilder sb = new StringBuilder();

            String line = null;

            while ((line= reader.readLine()) != null)
            {
                sb.append(line + "\n");
            }
            result = sb.toString();
        }
        catch (Exception e)
        {}
        finally
        {
            try
            {
                if(inputStream != null)
                {
                    inputStream.close();
                }
            }
            catch(Exception e)
            {}
        }

        xyCoords[] coords = new xyCoords[5000];;

        try
        {
            JSONObject btcPricesJSON = new JSONObject(result);
            JSONArray prices = btcPricesJSON.getJSONArray("values");
            if(prices != null)
            {
                int length = prices.length();
                for(int i = 0; i < length; ++i)
                {
                    JSONObject point = prices.getJSONObject(i);
                    coords[i].x = point.getDouble("x");
                    coords[i].y = point.getDouble("y");
                }
            }
        }
        catch(JSONException e)
        {}

        return coords;
    }

    @Override
    protected void onPostExecute(xyCoords[] coords)
    {   
        LinearLayout layout = (LinearLayout) findViewById(R.id.chart);
        if(m_chart == null)
        {
            initChart();
            addBtcPriceData(coords);
            m_chart = ChartFactory.getCubeLineChartView(GraphActivity.this, m_dataset, m_renderer, 0.3f);
            layout.addView(m_chart);
        }
        else
        {
            m_chart.repaint();
        }
    }

}

class xyCoords
{
    public double x;
    public double y;
}

}

06-21 23:52:18.288: E/AndroidRuntime(26917): FATAL EXCEPTION: AsyncTask #2
06-21 23:52:18.288: E/AndroidRuntime(26917): java.lang.RuntimeException: An error occured while executing doInBackground()
06-21 23:52:18.288: E/AndroidRuntime(26917):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
06-21 23:52:18.288: E/AndroidRuntime(26917):    at  java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
06-21 23:52:18.288: E/AndroidRuntime(26917):    at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
06-21 23:52:18.288: E/AndroidRuntime(26917):    at   java.util.concurrent.FutureTask.run(FutureTask.java:239)
06-21 23:52:18.288: E/AndroidRuntime(26917):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
06-21 23:52:18.288: E/AndroidRuntime(26917):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
06-21 23:52:18.288: E/AndroidRuntime(26917):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
06-21 23:52:18.288: E/AndroidRuntime(26917):    at java.lang.Thread.run(Thread.java:841)
06-21 23:52:18.288: E/AndroidRuntime(26917): Caused by: java.lang.NullPointerException
06-21 23:52:18.288: E/AndroidRuntime(26917):    at info.lombardo.crypttrack.GraphActivity$RetrieveBTCChartTask.doInBackground(GraphActivity.java:149)
06-21 23:52:18.288: E/AndroidRuntime(26917):    at info.lombardo.crypttrack.GraphActivity$RetrieveBTCChartTask.doInBackground(GraphActivity.java:1)
06-21 23:52:18.288: E/AndroidRuntime(26917):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
06-21 23:52:18.288: E/AndroidRuntime(26917):    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
06-21 23:52:18.288: E/AndroidRuntime(26917):    ... 4 more

1 个答案:

答案 0 :(得分:0)

您可以在logcat中看到,RuntimeException崩溃您的AsyncTask是由GraphActivity.java中第149行的NullPointerException引起的。我无法告诉粘贴代码中的哪一行,但这应该足以帮助您找到问题。