如何使用onSaveInstanceState android方向更改

时间:2017-10-28 05:21:32

标签: android json web-services

我正在使用android上的webservice。我跟着其中一个 lynda.com上的教程。我确实经历了课程。我得到数据 来自webservice并将其显示在“ListView”中。我有MainActivity类 和扩展IntentServcie的MyService类,以及实现parcelable的POJO类名称Course。它拥有我得到的webservice响应的一部分 点击。

public class MainActivity extends AppCompatActivity {
//member variables I have
    ListView listview;
    List<String> courseList = new ArrayList<>();
    ArrayAdapter<String> adapter;
    Course[] courses;
......
    public void runClickHandler(View view) {
        Intent intent = new Intent(this, MyService.class);
        //the url where I extract the JSON data
        intent.setData(Uri.parse(JSON_URL));
        startService(intent);

    }

在MyService类中,从webservice下载响应 我打开一个连接

 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
 conn.addRequestProperty("Authorization", TOKEN);

我使用GSON库转换JSON,打包数据并使用LocalBroadcastManager将其发送到MainActivity。

protected void onHandleIntent(Intent intent) {
          ...........
          messageIntent.putExtra(MY_SERVICE_PAYLOAD, courseList);
        //we package the data we want to share to the rest of the applicaiton
        LocalBroadcastManager manager =   LocalBroadcastManager.getInstance(getApplicationContext());
        manager.sendBroadcast(messageIntent);
        }

在我的MainActivity上,我使用BroadcastReceiver获取数据并在listview上显示它。 BroadcastReceiver的OnReceive方法。我有这个

public void onReceive(Context context, Intent intent) {
            courses = (Course[]) intent.getParcelableArrayExtra(MyService.MY_SERVICE_PAYLOAD);

            for (Course course : courses) {

                courseList.add(course.getCourseTitle());
            }
            Collections.sort(courseList);

           adapter = new ArrayAdapter<String>(
                    MainActivity.this,
                    android.R.layout.simple_expandable_list_item_1,
                    courseList);

            listview.setAdapter(adapter);

        }

当我更改屏幕方向时出现问题。我从webservice获得的数据被破坏了。我读过建议在XML文件上设置东西以调整屏幕大小的变化,这也被认为不是一个“好方法”。我认为使用的是覆盖onSaveInstanceState,如此处或其他帖子所建议的那样。我很难连接各个部分,并在改变方向时保留我的数据。     我该怎么处理?我会很感激您阅读的任何好文章,或者您如何根据我上面的实现解决问题。检查if(savedInstanceState!= null)后如何处理显示onCreate?我应该保存哪些成员变量数据?一切都变为null onDestroy()吗?这是onCreate()方法我有

    protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

    LocalBroadcastManager.getInstance(getApplicationContext())
   .registerReceiver(mBroadcastReceiver,new IntentFilter(MyService.MY_SERVICE_MESSAGE));

            listview = (ListView) findViewById(R.id.list);

        }

2 个答案:

答案 0 :(得分:0)

1

onSaveInstanceState(Bundle out) {
    out.putParcelableArrayList("COURSES", courseList);
}

2

onCreate(Bundle savedState) {
    // ...
    if (savedState != null) {
         courseList = savedState.getParcelableArrayList("COURSES");
    }
}

P.S。 * https://developer.android.com/reference/android/os/Bundle.html * https://developer.android.com/guide/components/activities/activity-lifecycle.html#saras

答案 1 :(得分:0)

在我发布问题之前,我已经查看了教程和stackoverflow响应。我花了很长时间才消化。 MaxV向我指出了正确的方向。在savedInstanceState上,我添加了这个

//I have coures parcelable array object as a member variable
// Course[] courses;
 @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putParcelableArray("COURSES", courses);

    }

OnCreate()方法我正在获取一系列课程,我创建了另一个帮助方法来显示coures列表

if (savedInstanceState != null) {

            courses = (Course[])savedInstanceState.getParcelableArray("COURSES");
            displayListOfCourses(courses);
        }

我创建了displayListOfCourses,我从前面的BroadcastReciever中获取了部分代码,并使其可重用。我最初的假设是以某种方式列出课程清单。现在,我的理解是我必须创建视图对象,ListView和arrayAdapter并自己重建视图。

public void displayListOfCourses(Course[] courses){
        for (Course course : courses) {

            courseList.add(course.getCourseTitle());
        }
        Collections.sort(courseList);

        adapter = new ArrayAdapter<String>(
                MainActivity.this,
                android.R.layout.simple_expandable_list_item_1,
                courseList);

        listview.setAdapter(adapter);

    }