【问题标题】:Stop/Resume activities and onCreate in Android在 Android 中停止/恢复活动和 onCreate
【发布时间】:2015-08-08 14:07:04
【问题描述】:

我是一名新的 Android 开发人员,我有一个问题。用户登录后,我需要从外部URL 获取一些数据并将它们显示在我的一项活动中。但我一直在阅读并发现:

当您的活动从停止状态返回到前台时,它会收到对 onRestart() 的调用。该系统还调用 onStart() 方法,每次您的活动变为 可见(无论是重新启动还是首次创建)。

还有这个

注意:您的活动将在每次 用户旋转屏幕。当屏幕改变方向时, 系统销毁并重新创建前台活动,因为 屏幕配置已更改,您的活动可能需要加载 替代资源(例如布局)。

Herehere

所以,看起来我不应该在 onCreate 方法上获取我需要的数据。那么在哪?在以前的活动中并将数据保存在手机内存中?这对我来说听起来不太好。

提前致谢。


编辑

我按照建议使用AsyncTask,但每次切换手机方向时,都会调用onCreate 方法。

我的主要活动:

public class MainActivity extends Activity implements AsyncResponse {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ReadJSONTask jsonTask = new ReadJSONTask();
        jsonTask.delegate = this;
        jsonTask.execute("http://www.myweb.com/myscript.php");
    }

    @Override
    public void processFinish(String output) {
        Toast.makeText(getApplicationContext(), output, Toast.LENGTH_LONG).show();
    }
}

ReadJSONTask 类:

public class ReadJSONTask extends AsyncTask<String, Void, String> {
    public AsyncResponse delegate = null;
    public String res;
    public Boolean finish = false;

    @Override
    protected String doInBackground(String... url) {
        String response = null;
        String adres = url[0];

        URL url_HTTPRequest = null;
        try {
            url_HTTPRequest = new URL(adres);
            response = transfer(url_HTTPRequest);

        } catch (MalformedURLException e) {
            Log.e("URL ERROR", "MalformedURLException");
        } catch (Exception e) {
            Log.e("URL ERROR", "exc");
        }

        return response;
    }

    @Override
    protected void onPostExecute(String result) {
        Log.d("mylog", "result= " + result);
        delegate.processFinish(result);
    }

    public String transfer(URL url) throws IOException {

        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        // inputStream = url.openStream();
        InputStream inputStream = urlConnection.getInputStream();
        BufferedReader bin = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
        String line = bin.readLine();
        StringBuffer sb = new StringBuffer();
        while (line != null) {
            sb.append(line);
            sb.append("\r\n");
            line = bin.readLine();
        }
        inputStream.close();
        return sb.toString();
    }
}

而界面只是:

public interface AsyncResponse {
    void processFinish(String output);
}

正如我所说,每次我切换手机方向时,都会执行所有异步过程(并显示Toast)。这正是我一开始就想避免的。

【问题讨论】:

    标签: android oncreate


    【解决方案1】:

    您不需要停止/恢复活动,您可以使用 AsyncTask 类和 doInBackGround 方法从外部 url 获取数据并显示给用户进程对话框等待

    【讨论】:

      【解决方案2】:

      永远不要尝试在Main thread 上从URL 获取数据。始终使用AsyncTaskURL 获取数据

      【讨论】:

      • 谢谢你们。我会做一些关于 AsyncTask 的研究。
      • 我刚刚编辑过,AsyncTask 没有回答我原来的问题。请检查一下。
      • 不需要按照这个例子实现AsyncResponse androidhive.info/2012/01/android-json-parsing-tutorial
      • 很棒的教程。谢谢。我按照教程进行操作,但手机的方向仍然出现同样的问题。每次我切换方向时,所有数据都会重新加载。
      【解决方案3】:

      您可以在同一个活动中写入,但不能在主线程中。也许 AsyncTask 会有所帮助。

      【讨论】:

        猜你喜欢
        • 2014-12-10
        • 1970-01-01
        • 1970-01-01
        • 2013-08-08
        • 1970-01-01
        • 1970-01-01
        • 2014-05-02
        • 1970-01-01
        • 2015-07-24
        相关资源
        最近更新 更多