从 class 扩展 AsyncTask 返回对象时出现问题
Problem with returning object form a class extending AsyncTask
我在使用 getter 函数 returning 来自 class HttpRequestCurrentWeather 扩展 AsyncTask 的对象时遇到问题。在此 class 中,我收到来自 API 的数据,并希望根据收到的内容在 CurrentWeatherFragment 中设置一些 TextView。问题是我不能 return 将 DataModel 的整个对象添加到 Fragment 并在那里设置组件,也不能将 TextViews 设置为 onPostExecute() 方法,因为我得到了 NullPointerException(java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'android.view.View android.view.View.findViewById(int)')。我应该如何设置这些 TextView?
public class CurrentWeatherFragment extends Fragment {
DataModel dataModel = new DataModel();
TextView tv_city;
TextView tv_temperature;
TextView tv_pressure;
public void setComponents() {
this.tv_city = getView().findViewById(R.id.tv_current_city_name);
tv_city.setText(dataModel.getName());
this.tv_temperature = getView().findViewById(R.id.tv_current_temperature);
tv_temperature.setText(dataModel.getTemp());
this.tv_pressure = getView().findViewById(R.id.tv_current_pressure);
tv_pressure.setText(dataModel.getPressure());
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View RootView = inflater.inflate(R.layout.fragment_current_weather_layout, container, false);
HttpRequestCurrentWeather httpRequestCurrentWeather1 = new HttpRequestCurrentWeather();
httpRequestCurrentWeather1.execute("", "", "");
// here I receive null object, but why?
dataModel = httpRequestCurrentWeather1.getDataModel();
// set the texts in components:
setComponents();
return RootView;
}
}
public class HttpRequestCurrentWeather extends AsyncTask<String, Void, DataModel> {
DataModel dataModel;
public HttpRequestCurrentWeather() {
this.dataModel = null;
}
@Override
protected DataModel doInBackground(String... params) {
ApiCurrentWeather apiCurrentWeather1 = new ApiCurrentWeather("London", "uk");
try {
// catch the model with recived data from API:
dataModel = apiCurrentWeather1.getWeather();
} catch (IOException e) {
e.printStackTrace();
}
return dataModel;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(DataModel dataModel) {
super.onPostExecute(dataModel);
CurrentWeatherFragment fragment = new CurrentWeatherFragment();
TextView tv_temperature = (TextView)fragment.getView().findViewById(R.id.tv_current_temperature);
tv_temperature.setText(dataModel.getTemp());
}
// this function returns NULL object ????
public DataModel getDataModel(){
return this.dataModel;
}
}
老实说,这不是合适的答案,但我试图使用 AsyncTask 实现的目标似乎使用 Retrofit 更容易,所以我最终放弃了这个想法并决定 改用 Retrofit。如果你有类似的问题,忘记 AsyncTask - Retrofit 更适合这个!
我在使用 getter 函数 returning 来自 class HttpRequestCurrentWeather 扩展 AsyncTask 的对象时遇到问题。在此 class 中,我收到来自 API 的数据,并希望根据收到的内容在 CurrentWeatherFragment 中设置一些 TextView。问题是我不能 return 将 DataModel 的整个对象添加到 Fragment 并在那里设置组件,也不能将 TextViews 设置为 onPostExecute() 方法,因为我得到了 NullPointerException(java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'android.view.View android.view.View.findViewById(int)')。我应该如何设置这些 TextView?
public class CurrentWeatherFragment extends Fragment {
DataModel dataModel = new DataModel();
TextView tv_city;
TextView tv_temperature;
TextView tv_pressure;
public void setComponents() {
this.tv_city = getView().findViewById(R.id.tv_current_city_name);
tv_city.setText(dataModel.getName());
this.tv_temperature = getView().findViewById(R.id.tv_current_temperature);
tv_temperature.setText(dataModel.getTemp());
this.tv_pressure = getView().findViewById(R.id.tv_current_pressure);
tv_pressure.setText(dataModel.getPressure());
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View RootView = inflater.inflate(R.layout.fragment_current_weather_layout, container, false);
HttpRequestCurrentWeather httpRequestCurrentWeather1 = new HttpRequestCurrentWeather();
httpRequestCurrentWeather1.execute("", "", "");
// here I receive null object, but why?
dataModel = httpRequestCurrentWeather1.getDataModel();
// set the texts in components:
setComponents();
return RootView;
}
}
public class HttpRequestCurrentWeather extends AsyncTask<String, Void, DataModel> {
DataModel dataModel;
public HttpRequestCurrentWeather() {
this.dataModel = null;
}
@Override
protected DataModel doInBackground(String... params) {
ApiCurrentWeather apiCurrentWeather1 = new ApiCurrentWeather("London", "uk");
try {
// catch the model with recived data from API:
dataModel = apiCurrentWeather1.getWeather();
} catch (IOException e) {
e.printStackTrace();
}
return dataModel;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(DataModel dataModel) {
super.onPostExecute(dataModel);
CurrentWeatherFragment fragment = new CurrentWeatherFragment();
TextView tv_temperature = (TextView)fragment.getView().findViewById(R.id.tv_current_temperature);
tv_temperature.setText(dataModel.getTemp());
}
// this function returns NULL object ????
public DataModel getDataModel(){
return this.dataModel;
}
}
老实说,这不是合适的答案,但我试图使用 AsyncTask 实现的目标似乎使用 Retrofit 更容易,所以我最终放弃了这个想法并决定 改用 Retrofit。如果你有类似的问题,忘记 AsyncTask - Retrofit 更适合这个!