Java 好的。Can';无法保存加载的数据
我无法保存从okhttp加载的数据。我的代码有什么问题。当我尝试在日志上加载数据时,应用程序崩溃。请帮忙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
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
回调调用它