有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java试图在工作线程上调用join

我有一个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()函数返回。因此,它将继续下一行,并尝试访问尚未初始化的空数组。因此,我得到一个空异常。我的解决方案是通过调用线程让主线程等待工作线程。join(),但我不知道如何通过这个Okhttp接口实现这一点。非常感谢您的帮助


共 (0) 个答案