2012-12-07 192 views
2

我的应用程序会自动加载数据,当我运行app.My问题是当我的屏幕垂直应用程序将加载数据从服务器,但是当屏幕旋转水平时,它再次加载数据。这样做时,旋转屏幕应用程序将再次加载数据。可以帮助我。当旋转屏幕android,应用程序自动加载数据

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.nhabep); 
    new LoadData().execute(); 
} 


// Class load data 
private class LoadData extends AsyncTask<Void, Void, Void> { 
    private ProgressDialog progressDialog; 
    private JSONArray jArray; 
    private String result = null; 
    private InputStream is = null; 
    private StringBuilder sb = null; 

    @Override 
    protected void onPreExecute() { 
     this.progressDialog = ProgressDialog.show(Nhabep.this, "", 
       " Loading..."); 
    } 

    @Override 
    protected void onPostExecute(final Void unused) { 
     this.progressDialog.dismiss(); 
     try { 
      if (flag == false) 
      { 
       Toast.makeText(Nhabep.this, "Không có bàn nào được chọn!!", Toast.LENGTH_SHORT).show(); 
      } 
      else 
      { 
       //Hiển thị thông tin các món ăn lên listview 
      listview = (ListView) findViewById(R.id.listView1); 
      this.progressDialog.dismiss(); 
      listview.setAdapter(new DataAdapter(Nhabep.this, soban 
        .toArray(new String[soban.size()]), thoigian 
        .toArray(new String[thoigian.size()]))); 
      listview.setOnItemClickListener(new OnItemClickListener() { 

       //xử lý khi chọn các item trên listview 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, 
         int position, long id) { 
        // TODO Auto-generated method stub 
        String soban2 = soban.get(position); 
        String cafesua2 = cafesua.get(position); 
        String cafeda2 = cafeda.get(position); 
        String cafeden2 = cafeden.get(position); 
        String duatuoi2 = duatuoi.get(position); 
        String nuocngot2 = nuocngot.get(position); 
        String cavienchien2 = cavienchien.get(position); 
        String goiga2 = goiga.get(position); 
        String bokho2 = bokho.get(position); 
        String bunbo2 = bunbo.get(position); 
        Intent i = new Intent(Nhabep.this, Show.class); 
        i.putExtra("soban", soban2); 
        i.putExtra("cafesua", cafesua2); 
        i.putExtra("cafeda", cafeda2); 
        i.putExtra("cafeden", cafeden2); 
        i.putExtra("duatuoi", duatuoi2); 
        i.putExtra("nuocngot", nuocngot2); 
        i.putExtra("cavienchien", cavienchien2); 
        i.putExtra("goiga", goiga2); 
        i.putExtra("bokho", bokho2); 
        i.putExtra("bunbo", bunbo2); 
        startActivity(i); 
       } 
      }); 
      Toast.makeText(Nhabep.this, "Thông tin bàn được tải thành công!!", Toast.LENGTH_SHORT).show(); 
      } 
     } catch (Exception e) { 

      Toast.makeText(getApplicationContext(), e.toString(), 
        Toast.LENGTH_LONG).show(); 
     } 

    } 

    //kết nối đến sererver và nhân thông tin trả về từ server 
    @Override 
    protected Void doInBackground(Void... params) { 
     try { 

      ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(
        "http://longvansolution.tk/loadthongtin.php"); 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      HttpResponse response = httpclient.execute(httppost); 
      HttpEntity entity = response.getEntity(); 
      is = entity.getContent(); 
      BufferedReader reader = new BufferedReader(
        new InputStreamReader(is, "iso-8859-1"), 80); 
      sb = new StringBuilder(); 
      sb.append(reader.readLine() + "\n"); 
      String line = "0"; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      is.close(); 
      result = sb.toString(); 

      //Kiểm tra thông tin nhận được từ server 
      //nếu null sẽ clear các textview 
      //nếu có thông tin thì đọc thông tin theo Json 
      if (result.toString().equalsIgnoreCase("null\n")) 
      { 
       flag = false; 
       soban.clear(); 
       thoigian.clear(); 
       cafesua.clear(); 
       cafeda.clear(); 
       cafeden.clear(); 
       duatuoi.clear(); 
       nuocngot.clear(); 
       cavienchien.clear(); 
       goiga.clear(); 
       bokho.clear(); 
       bunbo.clear(); 

      } else 
      { 
       //Lấy thông tin theo Json 
       jArray = new JSONArray(result); 
       if (jArray != null && jArray.length() > 0) 
       { 
        JSONObject json_data = null; 
        soban.clear(); 
        thoigian.clear(); 
        cafesua.clear(); 
        cafeda.clear(); 
        cafeden.clear(); 
        duatuoi.clear(); 
        nuocngot.clear(); 
        cavienchien.clear(); 
        goiga.clear(); 
        bokho.clear(); 
        bunbo.clear(); 
        for (int i = 0; i < jArray.length(); i++) { 
         json_data = jArray.getJSONObject(i); 
         thoigian1 = json_data.getString("date"); 
         soban1 = json_data.getString("ban"); 
         cafesua1 = json_data.getString("cafesua"); 
         cafeda1 = json_data.getString("cafeda"); 
         cafeden1 = json_data.getString("cafeden"); 
         duatuoi1 = json_data.getString("duatuoi"); 
         nuocngot1 = json_data.getString("nuocngot"); 
         cavienchien1 = json_data.getString("cavienchien"); 
         goiga1 = json_data.getString("goiga"); 
         bokho1 = json_data.getString("bokho"); 
         bunbo1 = json_data.getString("bunbo"); 
         thoigian.add(thoigian1); 
         soban.add(soban1); 
         cafesua.add(cafesua1); 
         cafeden.add(cafeden1); 
         cafeda.add(cafeda1); 
         duatuoi.add(duatuoi1); 
         nuocngot.add(nuocngot1); 
         cavienchien.add(cavienchien1); 
         goiga.add(goiga1); 
         bokho.add(bokho1); 
         bunbo.add(bunbo1); 
        } 
       } 
       flag = true; 
      } 
     } catch (Exception e) { 
      // Log.e("log_tag", "Error in http connection" + e.toString()); 
      Toast.makeText(getApplicationContext(), e.toString(), 
        Toast.LENGTH_LONG).show(); 
     } 

     return null; 

    } 
} 

回答

2

对于处置画面的rotaion在你的应用程序,你应该添加属性android:configChanges活动标签作为内:

<activity android:name=".Your_Activity" 
    android:configChanges="orientation|keyboardHidden" > 

,并在部分代码,以避免执行的AsyncTask重写onConfigurationChanged再次,您将需要使用布尔标志,如果屏幕旋转与否:

public class Your_Activity extends ListActivity { 
    public static boolean onrotaion=true; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if(onrotaion){ 
     new LoadData().execute(); 
      } 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
      //Change flag here 
      onrotaion=false; 
    } 
} 
+0

或者你也可以这样做,以避免再次运行AsyncTask http://android-er.blogspot.in/2011/09/onsaveinstancestate-and.html通过使用onSaveInstanceState和onRestoreInstanceState –

+1

不适用于我,总是重新加载,从来没有调用onConfigurationChanged – delive

0

你可以做的是尝试缓存数据到磁盘。然后,当你解雇你的任务时,检查数据的年龄。如果它太旧,那么实际上会打电话给服务器。否则,只需使用缓存的数据。

此外,我建议您使用loaders而不是AsyncTask。他们更可靠,并且通常会让你的应用更稳定。

0
 <activity android:name=".MainActivity" 
      android:label="@string/title_activity_main" 
      android:screenOrientation="portrait"> 
     </activity> 

将其设置为您的清单。

0

实际旋转屏幕也导致应用程序关闭并重新打开,这就是为什么你的代码重新运行。您可能需要检查自上次加载数据以来已经过了多长时间,并且只在数据需要时再次加载数据。

0

将以下代码写入您的Androidmanifest.xml文件的Activity标记中。

android:configChanges="orientation|keyboardHidden" 

更改您的活动标记后,看起来像这样。

<activity android:name=".Main_Activity" 
    android:configChanges="orientation|keyboardHidden" > 

并参见下面的链接了解更多信息。

Activity Elements

它会解决你的问题。

0

See here

这将帮助你,给你一个思想,妥善处理事情。[最佳做法]

0

你可以做以下的事情按照你的方案 1-如果我想知道我即使您更改设备的方位,然后在清单文件设置更改应用程序的方向屏幕方向

机器人:screenOrientation = “肖像”

机器人:screenOrientation =“风景”

2 - 如果你想改变与设备的朝向你的应用方向,但我想知道我来,然后加载上改变方向的数据在你的清单文件在你的活动使用

机器人:configChanges =“方向”

3-如果你想在你规定的时间间隔加载数据比较老带新,并执行任务 可以使用Asynk任务在t他的