Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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 从扩展AsyncTask的类返回对象时出现问题_Java_Android_Android Fragments_Android Asynctask_Return - Fatal编程技术网

Java 从扩展AsyncTask的类返回对象时出现问题

Java 从扩展AsyncTask的类返回对象时出现问题,java,android,android-fragments,android-asynctask,return,Java,Android,Android Fragments,Android Asynctask,Return,getter函数从类HttpRequestCurrentWeather任务返回对象时出现问题。在这个类中,我从API接收数据,并希望根据接收到的内容在CurrentWeatherFragment中设置一些文本视图。问题是,我无法将DataModel的整个对象返回到片段并在其中设置组件,也无法设置TextViews is onPostExecute()方法,因为我得到了一个NullPointerException(java.lang.NullPointerException:尝试在null对象引用

getter函数从类HttpRequestCurrentWeather任务返回对象时出现问题。在这个类中,我从API接收数据,并希望根据接收到的内容在CurrentWeatherFragment中设置一些文本视图。问题是,我无法将DataModel的整个对象返回到片段并在其中设置组件,也无法设置TextViews is onPostExecute()方法,因为我得到了一个NullPointerException(java.lang.NullPointerException:尝试在null对象引用上调用虚拟方法“android.view.view android.view.view.findViewById(int)”。我应该如何设置这些文本视图

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;
    }
}
公共类HttpRequestCurrentWeather扩展异步任务{
数据模型;
公共HttpRequestCurrentWeather(){
this.dataModel=null;
}
@凌驾
受保护的数据模型doInBackground(字符串…参数){
ApiCurrentWeather apiCurrentWeather1=新的ApiCurrentWeather(“伦敦”、“英国”);
试一试{
//使用从API接收的数据捕获模型:
dataModel=apicCurrentWeather1.getWeather();
}捕获(IOE异常){
e、 printStackTrace();
}
返回数据模型;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的void onPostExecute(DataModel DataModel){
onPostExecute(数据模型);
CurrentWeatherFragment=新的CurrentWeatherFragment();
TextView tv\u温度=(TextView)fragment.getView().findViewById(R.id.tv\u当前温度);
tv_temperature.setText(dataModel.getTemp());
}
//此函数返回空对象????
公共数据模型getDataModel(){
返回此.dataModel;
}
}

execute()
在后台线程上执行
AsyncTask
工作(
doInBackground()
),因此
dataModel
在下一条语句中仍然为
null
。您正在
onPostExecute()
中创建一个全新的
CurrentWeatherFragment()
,它没有视图
AsyncTask
本身相当古老,不再流行。您可能希望考虑更多的现代技术(例如,<代码> VIEWMODE > <代码> LIVADATA )。或者,您可以使用HTTP客户端库(例如,OkHttp,改型)为您处理后台线程。我知道这是一种非常古老的方法,但我真的想知道如何这样做。那么,你有什么建议?我只需要从HttpRequestCurrentWeather类中提取这个数据模型对象…“你有什么建议?”--我已经给了你两个建议。让
AsyncTask
正常工作并处理配置更改相当复杂。您需要设置一个单独的headless-retained片段来执行
AsyncTask
工作,然后找出如何将该单独片段的结果传递给这个片段。或者,您需要非常小心地将
CurrentWeatherFragment
设置为保留片段。这两件事我都不推荐。我建议你转向更现代的技术。是的,你是对的-使用改装要简单得多!谢谢
execute()
在后台线程上执行
AsyncTask
工作(
doInBackground()
),因此
dataModel
在下一条语句中仍然是
null
。您正在
onPostExecute()
中创建一个全新的
CurrentWeatherFragment()
,它没有视图
AsyncTask
本身相当古老,不再流行。您可能希望考虑更多的现代技术(例如,<代码> VIEWMODE > <代码> LIVADATA )。或者,您可以使用HTTP客户端库(例如,OkHttp,改型)为您处理后台线程。我知道这是一种非常古老的方法,但我真的想知道如何这样做。那么,你有什么建议?我只需要从HttpRequestCurrentWeather类中提取这个数据模型对象…“你有什么建议?”--我已经给了你两个建议。让
AsyncTask
正常工作并处理配置更改相当复杂。您需要设置一个单独的headless-retained片段来执行
AsyncTask
工作,然后找出如何将该单独片段的结果传递给这个片段。或者,您需要非常小心地将
CurrentWeatherFragment
设置为保留片段。这两件事我都不推荐。我建议你转向更现代的技术。是的,你是对的-使用改装要简单得多!谢谢
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;
    }
}