2015-08-08 122 views
2

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

当您的活动从停止状态回到前台时,它会收到对onRestart()的调用。系统还会调用onStart()方法,每当您的活动变为 可见(无论是第一次重新启动还是创建)时都会发生这种情况。

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

Herehere

因此,它看起来像我不应该得到我需要在onCreate方法上的数据。那么在哪?在之前的活动中并将数据保存在手机内存中?这对我来说听起来不太好。

在此先感谢。


编辑

我使用AsyncTask的建议,但每次我打开手机的方向,onCreate方法被调用。

我的MainActivity:

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

什么样的数据? – SaNtoRiaN

回答

1

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

2

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

2

永远不要尝试从URL获取数据在Main thread。始终使用AsyncTask获取来自URL的数据

+0

谢谢你们。我会做一些关于AsyncTask的研究。 – DandyCC

+0

我刚刚编辑,AsyncTask不回答我原来的问题。请检查一下。 – DandyCC

+0

没有必要实施AsyncResponse按照这个例子http://www.androidhive.info/2012/01/android-json-parsing-tutorial/ – HassanUsman