2013-09-24 3 views
1

Я использовал AsyncTask с Activity, и это дало мне желаемый результат без каких-либо сбоев. Теперь мне нужно использовать AsyncTask с Fragments. В FragmentsAsyncTask не обновляет пользовательский интерфейс. Я получил ответ here. Я пробовал эту логику в своем коде, но все же я не могу обновить интерфейс после получения ответа от сервлета. Ваша помощь будет очень оценена.Использование AsyncTask с фрагментами: Android

код, что я пробовал:

public class FragmentMyProfile extends Fragment 
{ 
    TextView txtViewUserFullName; 

    SharedPreferences shrdPref; 

    String currentUserFirstName = "", currentUserEmail = ""; 
    String URL = "http://10.0.2.2:8080/iGnite_Survey/GetUserDetailsServlet"; 

    String jsonObjectReceivedFromServer = ""; 


    public FragmentMyProfile() 
    { 
     // empty constructor required for fragment subclass 
    } 



    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     View rootView = inflater.inflate(R.layout.fragment_my_profile, container, false); 


     shrdPref = rootView.getContext().getSharedPreferences("shrdPref", Context.MODE_PRIVATE); 

     txtViewUserFullName = (TextView) rootView.findViewById(R.id.textViewUserFullName); 



     //get current user first name, default value is "" 
     currentUserFirstName = shrdPref.getString(String.valueOf(R.string.curentLoggedInUserFirstName), ""); 
     currentUserEmail = shrdPref.getString(String.valueOf(R.string.curentLoggedInUserEmail), ""); 


     //display current user first name 
     if(!currentUserFirstName.equals("")) 
     { 
      txtViewDisplayUserFirstName.setText("Welcome "+currentUserFirstName); 
     } 
     else 
     { 
      txtViewDisplayUserFirstName.setText(String.valueOf(R.string.welcomeUser)); 
     } 


     //get all user details from server 
     GetUserDetailsAsyncTask getUserDetailsAsyncTask = new GetUserDetailsAsyncTask (new FragmentCallback() 
     { 
      @Override 
      public void onTaskDone(String output) 
      { 
       //txtViewUserFullName.setText(output); 
      } 
     }); 
     getUserDetailsAsyncTask.execute(new String[] { URL }); 



     return rootView; 
    } 





    public interface FragmentCallback 
    { 
     public void onTaskDone(String output); 
    } 



    //------------------------------------------------------------------------------ 
    public class GetUserDetailsAsyncTask extends AsyncTask<String, Void, String> 
    { 
     private FragmentCallback mFragmentCallback; 

     public GetUserDetailsAsyncTask (FragmentCallback fragmentCallback) 
     { 
      mFragmentCallback = fragmentCallback; 
     } 


     @Override 
     protected String doInBackground(String... urls) 
     { 
      String output = null; 
      for (String url : urls) 
      { 
       output = sendDataToServer(url); 
      } 
      return output; 
     } 


     @Override 
     protected void onPostExecute (String output) 
     { 
      super.onPostExecute(output); 
      mFragmentCallback.onTaskDone(); 
      txtViewUserFullName.setText("output"); 
     } 


     private String sendDataToServer(String url) 
     { 
      String output = null; 

      try 
      { 
       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       HttpPost httpPost = new HttpPost(url); 

       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 

       nameValuePairs.add(new BasicNameValuePair("user_email", currentUserEmail)); 

       httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

       // Execute HTTP Post Request 
       HttpResponse response = httpClient.execute(httpPost); 

       HttpEntity httpEntity = response.getEntity(); 
       output = EntityUtils.toString(httpEntity); 
      } 
      catch (ClientProtocolException e) 
      { 
        e.printStackTrace(); 
      } 
      catch (IOException e) 
      { 
        e.printStackTrace(); 
      } 
      return output; 
     } 
    } 
} 
+0

и где находится 'mFragmentCallback.onTaskDone (...)' call? – Selvin

+0

Я удалил эту строку по ошибке. Эта строка находится внутри метода onPostExecute. Но все же его не обновляет UI –

+0

, потому что реализация 'FragmentCallback.onTaskDone (...)' передана конструктору GetUserDetailsAsyncTask' пуста/ничего не делает ... – Selvin

ответ

0

Вы должны использовать между фрагментом концепции связи, чтобы обновить тему UI из фрагмента AsyncTask т.е. ИНТЕРФЕЙС

Пожалуйста, обратитесь этот учебник с исходным кодом на лучше понять: Handle Android AsyncTask Configuration Change Using Fragment

+0

Ваша ссылка больше не существует. Любое обновление? – OroshiX

Смежные вопросы