1

で使用AsyncTaskしましたがActivity、失敗することなく望ましい結果が得られました。AsyncTaskで使用する必要がありますFragments。InFragments AsyncTaskは UI を更新していません。ここで答えを得ました。コードでそのロジックを試しましたが、サーブレットからの応答を取得した後でも 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 から UI スレッドを更新する必要があります。つまり、INTERFACE です。

理解を深めるために、ソースコードでこのチュートリアルを参照してください: Fragment を使用して Android AsyncTask 構成の変更を処理する

于 2015-06-10T23:32:59.277 に答える