在Android

时间:2015-08-08 14:07:05

标签: android oncreate

我是一位新的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显示)。这正是我想要首先避免的。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

获取数据

答案 2 :(得分:1)

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