【问题标题】:How Do I make my Connection an AsyncTask Connection如何使我的连接成为 AsyncTask 连接
【发布时间】:2012-05-12 00:07:59
【问题描述】:

更新:我发现最简单的方法是使用AQuery

我需要获取我的 HttpPost 以在另一个线程上获取 JSON 数据,但我不知道如何让它们一起工作。我查看了Painless Threading Blog,但仍然无法正常工作。

下面是我尝试同步之前的原始代码。

这是我第一次尝试 AsyncTasking,所以请不要太苛刻。谢谢。

在我的 OnCreate 中:

    /**
     * Connecting to MySQL using PHP and Populate the ListView
     * ========================================================
     */
    mList = (ListView) findViewById(R.id.sidebar_list);

    /** - http post for the list - */
    try  //<--THIS TRY METHOD IS WHAT NEED TO BE ON A SEPERATE THREAD??
    {
    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost("http://192.168.1.34/xxxx/xxxxx_list.php");

    List<NameValuePair> nameValue = new ArrayList<NameValuePair>();
    httpPost.setEntity(new UrlEncodedFormEntity(nameValue));

    HttpResponse httpResponse = httpClient.execute(httpPost);

    HttpEntity httpEntity = httpResponse.getEntity();

    is = httpEntity.getContent();

    } catch (Exception e)
    {
    // TODO handle e
    Log.e("log_tag", "Error in HTTP connect" + e.toString());
    Toast.makeText(this, "HTTP Connection Error : " + e.toString(), Toast.LENGTH_LONG).show();
    }

    // EVERYTHING BELOW HERE CAN BE ON THE UI THREAD???
    /**
     * Convert response to string------------------------------------
     * ----------------------
     * */
    try
    {
    BufferedReader BufR = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
    sb = new StringBuilder();
    sb.append(BufR.readLine() + "\n");

    String line = "0";
    while ((line = BufR.readLine()) != null)
    {
    sb.append(line + "\n");
    }
    is.close();
    result = sb.toString();
    } catch (Exception e)
    {
    // TODO handle e
    Log.e("log_tag", "Error in convert to String" + e.toString());
    }

    // paring data
    int q_id;
    String q_label;
    String q_title;
    String q_description;
    String q_gotoURL;

    try
    {
    jArray = new JSONArray(result);
    JSONObject json_data = null;
    for (int i = 0; i < jArray.length(); i++)
    {
    json_data = jArray.getJSONObject(i);
    q_id = json_data.getInt("_ID");
    q_label = json_data.getString("label");
    q_title = json_data.getString("title");
    q_description = json_data.getString("description");
    q_gotoURL = json_data.getString("gotoURL");
    // mList.add();
    }

    setupList();
    } catch (JSONException e1)
    {
    Toast.makeText(getBaseContext(), "No Data Found", Toast.LENGTH_LONG).show();
    } catch (ParseException e1)
    {
    e1.printStackTrace();
    }

    };

【问题讨论】:

    标签: android multithreading json android-asynctask


    【解决方案1】:

    我想你可以试试这样的:

    public class MyActivity extends Activity {
    
    // paring data
    int q_id;
    String q_label;
    String q_title;
    String q_description;
    String q_gotoURL;
    Context context;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        mList = (ListView) findViewById(R.id.sidebar_list);
        context = getApplicationContext();
        new HttpTask().execute("http://192.168.1.34/xxxx/xxxxx_list.php");
    
    }
    private class HttpTask extends AsyncTask<String, Void, String> {
    
    
        protected String doInBackground(String... urls) {
            try {
                HttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(urls[0]);
    
                List<NameValuePair> nameValue = new ArrayList<NameValuePair>();
                httpPost.setEntity(new UrlEncodedFormEntity(nameValue));
    
                HttpResponse httpResponse = httpClient.execute(httpPost);
    
                HttpEntity httpEntity = httpResponse.getEntity();
    
                is = httpEntity.getContent();
    
                // Get result
                BufferedReader BufR = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
                sb = new StringBuilder();
                sb.append(BufR.readLine() + "\n");
    
                String line = "0";
                while ((line = BufR.readLine()) != null) {
                    sb.append(line + "\n");
                }
                is.close();
                result = sb.toString();
    
            } catch (Exception e) {
                Toast.makeText(context, "HTTP Connection Error : " + e.toString(), Toast.LENGTH_LONG).show();
                return null;
            }
        }
    
        protected void onPostExecute(String result) {
            try {
                if(result == null)
                    throw new Exception("result is null");
                jArray = new JSONArray(result);
                JSONObject json_data = null;
                for (int i = 0; i < jArray.length(); i++) {
                    json_data = jArray.getJSONObject(i);
                    q_id = json_data.getInt("_ID");
                    q_label = json_data.getString("label");
                    q_title = json_data.getString("title");
                    q_description = json_data.getString("description");
                    q_gotoURL = json_data.getString("gotoURL");
                    // mList.add();
                }
                //send message to handler to draw list
                drawListHandler.sendEmptyMessage(0);
            } catch (Exception e1) {
                Toast.makeText(context, e1.getMessage(), Toast.LENGTH_LONG).show();
            }
        }
    }
    
    Handler drawListHandler = new Handler(){
        /* (non-Javadoc)
         * @see android.os.Handler#handleMessage(android.os.Message)
         */
        @Override
        public void handleMessage(Message msg) {
            setupList();
        }
    };
    }
    

    【讨论】:

      【解决方案2】:

      除了setupList()(假设更新了一些ListView)和Toast,其余的应该在doInBackground()中。您希望在主应用程序线程上尽可能少的代码。

      【讨论】:

      • 虽然mList = (ListView) findViewById(R.id.sidebar_list);也可以留在onCreate(...)中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 2012-11-14
      • 1970-01-01
      • 2012-11-20
      相关资源
      最近更新 更多