我是一位新的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
显示)。这正是我想要首先避免的。
答案 0 :(得分:2)
您不需要停止/恢复活动,您可以使用 AsyncTask 类和 doInBackGround 方法从外部网址获取数据并向用户进程显示等待的对话框
答案 1 :(得分:2)
永远不要尝试从URL
Main thread
获取数据。始终使用AsyncTask
从URL
答案 2 :(得分:1)
您可以在同一个活动中编写,但不能在主线程中编写。也许 AsyncTask 会有所帮助。