2015-08-08 48 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