1

我用过AsyncTaskActivity它给了我想要的结果,没有任何失败。现在我需要使用AsyncTaskwith Fragments。在Fragments AsyncTask没有更新 UI。我在这里得到了答案。我在我的代码中尝试了该逻辑,但在从 servlet 获得响应后仍然无法更新 UI。您的帮助将不胜感激。

编写我尝试过的代码:

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;
        }
    }
}
4

1 回答 1

0

您必须使用片段间通信概念从片段 asynctask 即 INTERFACE 更新 UI 线程

请参考本教程和源代码以更好地理解它:使用 Fragment 处理 Android AsyncTask 配置更改

于 2015-06-10T23:32:59.277 回答