Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 好的。Can';无法保存加载的数据_Java_Android_Okhttp - Fatal编程技术网

Java 好的。Can';无法保存加载的数据

Java 好的。Can';无法保存加载的数据,java,android,okhttp,Java,Android,Okhttp,我无法保存从okhttp加载的数据。我的代码有什么问题。当我尝试在日志上加载数据时,应用程序崩溃。请帮忙 public class MainActivity extends AppCompatActivity { private static final String URL = "https://chroniclingamerica.loc.gov/search/titles/results/?terms=michigan&format=json&page=5"; privat

我无法保存从okhttp加载的数据。我的代码有什么问题。当我尝试在日志上加载数据时,应用程序崩溃。请帮忙

public class MainActivity extends AppCompatActivity {
private static final String URL = "https://chroniclingamerica.loc.gov/search/titles/results/?terms=michigan&format=json&page=5";
private String data;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    loadData();
    Log.d("DATA", data);
}

private void loadData() {
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
            .url(URL)
            .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 {
            data = response.body().string();
        }
    });
}
}

解释 问题在于如何执行代码(即同步与异步)

您调用方法
loadData()
,该方法不会像您期望的那样设置类属性数据-一旦得到响应,它将设置属性
data
,但是该函数
loadData
不会等待响应(即它不会阻止当前线程或执行代码)。这意味着在下一行
LOG.d(“数据”,Data),数据尚未设置,因此为空(并将使应用程序崩溃)

解决方案 如果您只想记录数据,那么在onResponse回调中分配日志语句后,只需移动日志语句即可

private void loadData() {
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
            .url(URL)
            .build();
    Call call = client.newCall(request);
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            // Some error has occurred
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {   
            processData(response.body().string());
        }
    });
}

private void processData(String data) {
    Log.d("DATA", data);
    // To other stuff here given your value data. 
}
解释 问题在于如何执行代码(即同步与异步)

您调用方法
loadData()
,该方法不会像您期望的那样设置类属性数据-一旦得到响应,它将设置属性
data
,但是该函数
loadData
不会等待响应(即它不会阻止当前线程或执行代码)。这意味着在下一行
LOG.d(“数据”,Data),数据尚未设置,因此为空(并将使应用程序崩溃)

解决方案 如果您只想记录数据,那么在onResponse回调中分配日志语句后,只需移动日志语句即可

private void loadData() {
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
            .url(URL)
            .build();
    Call call = client.newCall(request);
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            // Some error has occurred
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {   
            processData(response.body().string());
        }
    });
}

private void processData(String data) {
    Log.d("DATA", data);
    // To other stuff here given your value data. 
}

“当我试图加载日志应用程序崩溃的数据时。”-这太宽泛了。是否存在错误/异常?即使返回响应,其空指针异常。请发布stacktrace。您遇到了什么异常?在“当我尝试加载应用程序崩溃日志数据时”的帖子中添加错误日志-这太宽泛了。是否存在错误/异常?即使返回响应,其空指针异常。请发布stacktrace。您遇到了什么异常?在帖子中添加您的错误日志谢谢您的回答。但是,我应该怎么做才能从类级别访问它呢?我的建议是,在类级别上没有对数据的引用。只需将其传递给另一个函数。例如,您应该有一个方法
处理数据(字符串数据)
,并从
onResponse
callback调用它谢谢您的回答。但是,我应该怎么做才能从类级别访问它呢?我的建议是,在类级别上没有对数据的引用。只需将其传递给另一个函数。例如,您应该有一个方法
handleData(字符串数据)
,并从
onResponse
回调调用它