Android asynchronous post blocks UI thread

落花浮王杯 提交于 2019-12-25 03:36:09

问题


I'm developing an Android app. I want to post to a server using asynctask. However, I still have an error which indicates that the UI thread is blocked.

I want to parse the XML response and display it in a list view, but I cannot proceed because the UI thread is still blocked.

public class AsynchronousPost extends ListActivity implements OnClickListener {

EditText SearchValue;
Button SearchBtn;
String URL = "";



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search_interface);


    SearchBtn = (Button) findViewById(R.id.searchbtn);


    SearchBtn.setOnClickListener(this);
}

public void onClick(View views) {

 new MyAsyncTask().execute();


}

private class MyAsyncTask extends AsyncTask<String, Integer, Document> {

    private final String URL = "url";

    private final String username = "username";
    private final String password = "password";
    private EditText SearchValue;


    @Override
    protected Document doInBackground(String... arg0) {
        // TODO Auto-generated method stub

        getXmlFromUrl(URL); // getting XML
        return null;


    }

            @Override
    protected void onPostExecute() {

            //want to parse xml response
             //display on listview
            }


    public String getXmlFromUrl(String url) {
        String xml = null;

        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            SearchValue = (EditText) findViewById(R.id.search_item);
            String Schvalue = SearchValue.getText().toString();

            // Add your data
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
                    5);
            nameValuePairs
                    .add(new BasicNameValuePair("username", username));
            nameValuePairs
                    .add(new BasicNameValuePair("password", password));
            nameValuePairs.add(new BasicNameValuePair("searchItem",
                    Schvalue));

            // response stored in response var
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            xml = EntityUtils.toString(httpEntity);

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        } catch (ClientProtocolException e) {
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        // return XML
        return xml;
    }




}

}

回答1:


There are a couple problems that I see. First, you aren't passing anything in execute() but in your class declaration you are telling doInBackground() to expect a String. Secondly, you are telling onPostExecute() to expect a Document but you are returning null from doInBackground() and not taking any parameters in onPostExecute(). Unless I missed something, I don't see how this even compiles




回答2:


protected Object doInBackground(String... params) {
    //this method of AsyncTask is not running on the UI Thread -- here do just non UI         taks
    return result;   
}

@Override
protected void onPostExecute(Object result) {
   //I'm not sure but I think this method is running on the UI Thread
   //If you have long operations here to do you will block UI Thread
   //put the tasks in the doInBackground...
   //to fill the elements in the UI elements use
   // 
   runOnUiThread (new Runnable() {
      @Override
      public void run() {
        //here fill your UI elements 

  }});
}


来源:https://stackoverflow.com/questions/16497560/android-asynchronous-post-blocks-ui-thread

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!