2015-03-31 39 views
0

我有一個片段活動並希望從我的php腳本中獲取數據。我需要這些數據來有效地繪製我的UI。我的問題是我的UI /碎片在我得到數據之前畫出來,我不知道爲什麼,因爲我儘早在onCreate中啓動它。我把一個對話框放入前後,以有效地凍結用戶界面,同時數據在後臺被回收,但是......我沒有看到這種情況發生,我認爲在調試過程中出現對話時調用它太晚了,它顯示了繪製屏幕的頂部這讓我感到莫名其妙。在哪裏發射片段活動中的異步腳本

我有一個替代的解決方案是在調用活動(之前的活動)中激發asyncTask並將結果傳入包中,但我不喜歡此解決方案,因爲它的剛性和可能導致屏幕旋轉的問題。

我一直堅持這個很長時間,任何人都可以告訴我在哪裏把我的異步執行 - 對話框應該有效地使其同步過程。我把我的異想天開地放在我認爲可能/理智和沒有運氣的地方。

在下面我執行oncreate()。注意執行不會更新任何內容,而是預先更新一個「不變」的測試字符串,並在後綴中更改「已更改」,以便我可以在代碼中的各個點上看到它的狀態。它不會改變,然後我畫我的屏幕。

public class StaggeredGridActivityFragment extends FragmentActivity { 


    String test ="not changed"; 
    private TilesAdapter mAdapter; 
    private ArrayList<String> mData; 
    private StaggeredGridView mGridView; 

    private static final String TAG = "StaggeredGridActivityFragment"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     try 
     { 
      // Loading tile data in Background Thread 
      new GetLoginTiles().execute(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     super.onCreate(savedInstanceState); 

     this.requestWindowFeature(Window.FEATURE_NO_TITLE); //remove title bar 

     final FragmentManager fm = getSupportFragmentManager(); 

     // Create the list fragment and add it as our sole content. 
     if (fm.findFragmentById(android.R.id.content) == null) { 
      final StaggeredGridFragment fragment = new StaggeredGridFragment(); 
      fm.beginTransaction().add(android.R.id.content, fragment).commit(); 
     } 
     Intent i=getIntent(); 
     Bundle extras = i.getExtras(); 
     String tmp = extras.getString("myKey"); 

    } 


    private class StaggeredGridFragment extends Fragment implements AbsListView.OnScrollListener, AbsListView.OnItemClickListener { 
       //private StaggeredGridView mGridView; 
       private boolean mHasRequestedMore; 
       // private TilesAdapter mAdapter; 

       //private ArrayList<String> mData; 

       @Override 
       public void onCreate(final Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setRetainInstance(true); 
       } 

       @Override 
       public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { 
        return inflater.inflate(R.layout.activity_sgv, container, false); 
       } 

       @Override 
       public void onActivityCreated(final Bundle savedInstanceState) { 
        List<NameValuePair> params = new ArrayList<NameValuePair>(); 

        //Encapsulate all within a post cereate from a async task or call a blocking http call 
        super.onActivityCreated(savedInstanceState); 

        mGridView = (StaggeredGridView) getView().findViewById(R.id.grid_view); 

        if (savedInstanceState == null) { 
         final LayoutInflater layoutInflater = getActivity().getLayoutInflater(); 
         View header = layoutInflater.inflate(R.layout.list_item_header_footer, null); 
         mGridView.addHeaderView(header); 
        } 

        if (mAdapter == null) { 
         mAdapter = new TilesAdapter(getActivity(), R.id.summary1_value); 
        } 

        if (mData == null) { 
         mData = ActivityTileData.getLoginTileDataArray(getActivity()); 
        } 


        for (String data : mData) { 
         mAdapter.add(data); //Add each mData TileAdapter element to an mAdapter where it will be further broken down and used by the TileAdapter 
        } 

        mGridView.setAdapter(mAdapter); 
        mGridView.setOnScrollListener(this); 
        mGridView.setOnItemClickListener(this); 
       } 

       @SuppressLint("LongLogTag") 
       @Override 
       public void onScrollStateChanged(final AbsListView view, final int scrollState) { 
        Log.d(TAG, "onScrollStateChanged:" + scrollState); 
       } 

       @SuppressLint("LongLogTag") 
       @Override 
       public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount, final int totalItemCount) { 
        Log.d(TAG, "onScroll firstVisibleItem:" + firstVisibleItem + 
          " visibleItemCount:" + visibleItemCount + 
          " totalItemCount:" + totalItemCount); 
        // our handling 
        if (!mHasRequestedMore) { 
         int lastInScreen = firstVisibleItem + visibleItemCount; 
         if (lastInScreen >= totalItemCount) { 
          Log.d(TAG, "onScroll lastInScreen - so load more"); 
          mHasRequestedMore = true; 
          onLoadMoreItems(); 
         } 
        } 
       } 

       //Loads all of the objects from the getLoginTileData() if called 
       private void onLoadMoreItems() { 
        while(mAdapter.getCount()<mData.size()) { 
         //final ArrayList<String> sampleData = SampleData.generateSampleData(); 
         final ArrayList<String> loginTileData = ActivityTileData.getLoginTileDataArray(getActivity()); 
         for (String data : loginTileData) { 
          mAdapter.add(data.toString()); 
         } 
         // stash all the data in our backing store 
         mData.addAll(loginTileData); 
         // notify the adapter that we can update now 
         mAdapter.notifyDataSetChanged(); 
         mHasRequestedMore = false; 
        } 
       } 

       @Override 
       public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { 
        Toast.makeText(getActivity(), "Item Clicked: " + position, Toast.LENGTH_SHORT).show(); 
       } 
      } 
    // Progress Dialog 
    private ProgressDialog qDialog; 
    // JSON parser class 
    JSONParser jParser = new JSONParser(); 
    String url_login ="http://xxx/xxx.php"; 
    /** 
    * Background Async Task to Load all images by making HTTP Request 
    * */ 
    class GetLoginTiles extends AsyncTask<String, String, String> { 
     /** 
     * Before starting background thread Show Progress Dialog 
     * */ 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      qDialog = new ProgressDialog(StaggeredGridActivityFragment.this); 
      qDialog.setMessage("Please wait..."); 
      qDialog.setIndeterminate(false); 
      qDialog.setCancelable(false); 
      qDialog.show(); 
     } 

     @Override 
     protected String doInBackground(String... args) { 
      // Building Parameters 
      List<NameValuePair> params = new ArrayList<NameValuePair>(); 
      // getting JSON string from URL 
      JSONObject jsonLogin = jParser.makeHttpRequest(url_login, "GET", params); 
      test=jsonLogin.toString(); 

      return jsonLogin.toString(); 
     } 

     /** 
     * After completing background task Dismiss the progress dialog 
     * **/ 
     protected void onPostExecute(String jsonString) { 
      // dismiss the dialog after getting all questions 
      qDialog.dismiss(); 
      // updating UI from Background Thread 
      runOnUiThread(new Runnable() { 
       public void run() { 
        /** 
        * Updating parsed JSON data into imagebuttons 
        * */ 
        test="local test has changed"; 
       } 
      }); 

     } 
    } 
} 

回答

0

我有一個替代的解決方案這是火的AsyncTask呼籲活動(之前的活動),並通過導致包,但我不喜歡這樣的解決方案,它的剛性,並可能導致屏幕旋轉問題。

這是做

覆蓋的onSaveInstanceState保存旋轉

的演員也看到here更多細節

編輯一個好辦法:看來你是試圖改變文本使用

test =「本地測試已更改」;

whaat你需要做的是活動傳遞到的AsyncTask然後

VIEWTYPEHERE button= (VIEWTYPEHERE) activity.findViewById(R.id.YOUR_VIEW"S_ID_HERE); 

button.setText( 「」);

上後一對夫婦的音符

執行對UI線程運行時你並不需要一個新的可運行 你也忘了打電話給.RUN()就可以了

+0

嗯ok了。這似乎很混亂,但也許這是標準。爲什麼我不能在開始創建異步任務並在開始繪製之前獲取數據?我在prev活動中這樣做,它沒有問題。 – Fearghal 2015-03-31 11:05:44

+0

我不認爲這是一個好主意,嘗試和暫停的onCreate反正 電話在前面的活動異步任務 顯示進度對話框前和隱藏的後 ,然後通過臨時演員,開始活動如果你保持異步任務作爲它自己的類別不雜亂我有一個項目約20異步任務,他們都以這種方式工作 – MetalDragon 2015-03-31 11:09:33

+0

這是一個工廠的建議。很高興聽到我沒有一百萬英里了。你知道每個機會爲什麼我的片段活動拒絕停止創建嗎? – Fearghal 2015-03-31 11:21:22