【发布时间】:2015-08-08 14:07:04
【问题描述】:
我是一名新的 Android 开发人员,我有一个问题。用户登录后,我需要从外部URL 获取一些数据并将它们显示在我的一项活动中。但我一直在阅读并发现:
当您的活动从停止状态返回到前台时,它会收到对 onRestart() 的调用。该系统还调用 onStart() 方法,每次您的活动变为 可见(无论是重新启动还是首次创建)。
还有这个
注意:您的活动将在每次 用户旋转屏幕。当屏幕改变方向时, 系统销毁并重新创建前台活动,因为 屏幕配置已更改,您的活动可能需要加载 替代资源(例如布局)。
所以,看起来我不应该在 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)。这正是我一开始就想避免的。
【问题讨论】: