2013-12-21 54 views
0
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
    View myFragmentView = inflater.inflate(R.layout.fragment_home, container, false);  

    return myFragmentView; 
} 

我通常有這樣的onCreateView執行和我所有的代碼是在裏面,由於建議我把和插入我的代碼的其餘部分爲onViewCreated。我沒有抱怨,但發生了完全相同的事情。當我打開片段活動時,ASyncTask不會執行。這裏是我的onViewCreated執行的AsyncTask作爲fragmentactivity開始(不執行)

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
Requ connReq = new Requ(); 
     connReq.execute(); //go go power rangers 
} 

這畢竟不是那麼複雜,但由於某種原因沒有啓動我的AsyncTask。它'顯示'ProgressDialog開始於onPreExecute並在onPostExecute解散。所以你可以說它只是不會執行我的doInBackground我在做這件事情有什麼問題?我只是想要我的ASyncTask執行,因爲我打開片段並加載我的數據。 我真的很感謝幫助,在此先感謝。我在各地搜索,但我真的找不到適當的解決方案,我認爲會有一個。

PS:在的AsyncTask工作得很好,當我執行添加到onClickListener

我的AsyncTask:

private class Requ extends AsyncTask<String, String[], String[]> { 

    final String pdMessage = getString(R.string.pd_wait); 

    ProgressDialog pd = new ProgressDialog(getActivity()); 

    @Override 
    protected void onPreExecute() { 
     pd.setMessage(pdMessage); 
     pd.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     pd.setCancelable(false); 
     pd.setIndeterminate(true); 
     pd.show(); 
    } 

    @Override 
    protected String[] doInBackground(String... params) { 

     String[] connResult; 

      final String SipUrlStr = getString(R.string.sip_url); 

      String bsm = ""; 
      String bst= ""; 
      String hs= ""; 
      String as= ""; 

     try { 
       JSONTokener SipTokener = new JSONTokener(Sources.httpConnGet(SipUrlStr).toString()); 
        JSONArray SipArray=new JSONArray(SipTokener); 

        for(int i=0; i<(SipArray.length()); i++) 
        { 
         JSONObject json_obj_sip = yeniSipArray.getJSONObject(i); 

         bsm = json_obj_sip.getString("mt"); 
         bst = json_obj_sip.getString("tt"); 
         hs = json_obj_sip.getString("pta"); 
         as = json_obj_sip.getString("pta2"); 
        } 

     } catch (Exception e) { 
      bsm = getString(R.string.def_sip); 
      bst = getString(R.string.def_sip); 
      hs = getString(R.string.has); 
      as = getString(R.string.ass); 
     } 

     connRes = new String[]{bsm, bst, hs, as}; 
     return connRes; 
    } 

    @Override 
    protected void onPostExecute(String[] connRes) { 
     super.onPostExecute(connRes); 


     res[0] = connRes[0]; 
     res[1] = connRes[1]; 
     res[2] = connRes[2]; 
     res[3] = connRes[3]; 
     res[4] = connRes[4]; 
     res[5] = connRes[5]; 
     res[6] = connRes[6]; 
     res[7] = connRes[7]; 
     res[8] = connRes[8]; 
     res[9] = connRes[9]; 
     res[10] = connRes[10]; 
     res[11] = connRes[11]; 
     pd.dismiss(); 
    } 


} 
+1

發佈你的asynctask以及 –

+0

@vipulmittal在這裏,你是先生 –

+0

它執行所有正確的,如果'onPreExecute()'被調用。然而,你正在捕捉所有'Exception'並忽略它們。至少在catch塊中添加一些日誌記錄,以便更好地找出錯誤。 – laalto

回答

0

事實證明這是關於這個循環。由於我試圖在MainThread上啓動AsyncTask,因此代碼和AsyncTask沒有足夠的時間完成其工作。而且絕對不應該讓線程等待AsyncTask。這違反了AsyncTask的第一條規則。 「不這樣做。」好吧,讓我感動的AsyncTask執行到onCreate()這樣將有更多的時間和它不會執行每次我打開片段......

@Override 
    public void onCreate(Bundle savedInstanceState) { 

     Requ connReq = new Requ(); 
     connReq.execute(); //go go power rangers 

    super.onCreate(savedInstanceState); 
    } 

那麼,這是很重要的,我提出我的所有代碼轉換爲AsyncTaskonPostExecute()方法。如果你想改變一個變量或改變一個視圖,你應該這樣做onPostExecute()

0

嘗試在

onActivityCreated 

功能開始你的異步任務

public void onActivityCreated(Bundle b){ 

super.onActivityCreated(b); 
// Execute here 
//Get views 
getView().findViewById(<ID>); 
} 
+0

有沒有辦法在onactivitycreated中以編程方式引入視圖? Lile view.findviewbyid ... –

+0

你可以在onActivityCreated中調用getView()並在其上調用findViewById。 –