试图在工作线程上调用join

时间:2016-05-06 04:27:40

标签: java android multithreading okhttp

我有一个onClickListener,它使用Okhttp在后台异步获取一些东西。这是OnClickListener:

mGetChartButton.setOnClickListener(new View.OnClickListener() {
    @Override
        public void onClick(View v) {
            String companyName = mSymbolValue.getText().toString();
            getRequest(companyName, "chart");    
            Log.i(TAG, mChartProfile.getSizeDates()+""); // Null exception happens here
    }
}); 

这是Okhttp片段:

OkHttpClient client = new OkHttpClient();
    Request request = new Request
            .Builder()
            .url(completeUrl)
            .build();
    Call call = client.newCall(request);
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {

        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            try {
                String jsonData = response.body().string();
                Log.v(TAG, jsonData);

                if (response.isSuccessful()) {

                    if (requestType.equals("quote")) {
                        isValidSearch = getQuote(jsonData);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if (isValidSearch) {
                                    updateDisplay();
                                }
                                toggleFacts(isValidSearch);
                            }
                        });
                    }

                    else{
                        getChartInfo(jsonData);

                    }

                } else {
                    alertUserAboutError();
                }
            } catch (IOException e) {
                Log.e(TAG, "Exception caught: ", e);
            } catch (JSONException e) {
                Log.e(TAG, "JSONException caught: ", e);
                Toast.makeText(BuyActivity.this, "oops!", Toast.LENGTH_LONG).show();
            }catch (ParseException e){
                Log.e(TAG, "Unable to parse", e);
            }
        }
    });
    // How do I do a thread.join() here?

private void getChartInfo(String jsonData) throws JSONException, ParseException{

    JSONObject wholeChartData = new JSONObject(jsonData);

    JSONArray dates = wholeChartData.getJSONArray("Dates");
    mChartProfile = new ChartProfile();
    // ChartProfile contains ArrayList of ChartDate and ArrayList of ChartValue
    for (int i = 0; i < dates.length(); i++){
        ChartDate chartDate = new ChartDate(dates.getString(i));
        mChartProfile.addToDates(chartDate);
    }


    JSONArray values = close.getJSONArray("values");

    for (int i = 0; i < values.length(); i++){
        ChartValue chartValue = new ChartValue(values.getDouble(i));
        mChartProfile.addToValues(chartValue);
    }
}

现在,我收到一个错误的线程退出未捕获的异常。这是由null异常引起的,因为在调用mChartProfile.getSizeDates()时,尚未写入值。我的直觉是对getChartInfo(jsonData)的调用没有完成,主UI线程已经从getRequest()函数返回。因此,它将继续下一行,并尝试访问尚未初始化的空数组。因此,我得到一个null异常。我的解决方案是通过调用thread.join()使主线程在工作线程上等待,但我不知道如何通过这个Okhttp接口执行此操作。非常感谢任何帮助。

0 个答案:

没有答案