【问题标题】:Using AsyncTask with Fragments: Android将 AsyncTask 与 Fragments 一起使用:Android
【发布时间】:2015-06-11 07:32:59
【问题描述】:

我已经使用AsyncTaskActivity,它给了我想要的结果,没有任何失败。 现在我需要使用AsyncTaskFragmentsFragments AsyncTask 没有更新 UI。我得到了答案here。我在我的代码中尝试了该逻辑,但在从 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;
        }
    }
}

【问题讨论】:

  • mFragmentCallback.onTaskDone(...) 的电话在哪里?
  • 我错误地删除了该行。该行位于“onPostExecute”方法中。但它仍然没有更新用户界面
  • 因为FragmentCallback.onTaskDone(...) 的实现传递给GetUserDetailsAsyncTask 构造函数是空的/什么也不做...
  • 您找到解决方案了吗? @SanjayJoshi

标签: android android-asynctask


【解决方案1】:

您必须使用片段间通信概念来从片段异步任务更新 UI 线程,即 INTERFACE

请参考本教程的源代码以更好地理解它:Handle Android AsyncTask Configuration Change Using Fragment

【讨论】:

    猜你喜欢
    • 2011-07-08
    • 2012-03-18
    • 2015-11-26
    • 2015-11-20
    • 1970-01-01
    • 2020-05-05
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多