0

我已经看过几个教程,但它们都比防止主线程中的网络调用的 Android 更新更老。我尝试将调用它的代码移动到 RetrieveFeedTask,但这对我没有帮助,因为我无法在我的主线程中获取数据。这是我所做的:

class RetrieveFeedTask extends AsyncTask <String, Void, String>
{

    private Exception exception;

    private String doInBackground()
    {
        String returnString = "sample";

         ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        //http post
        try{
             HttpClient httpclient = new DefaultHttpClient();
             HttpPost httppost = new HttpPost("http://localhost/sample_array.php");
             httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
             HttpResponse response = httpclient.execute(httppost);
             HttpEntity entity = response.getEntity();
             is = entity.getContent();
             }catch(Exception e){
                 Log.e("log_tag", "Error in http connection"+e.toString());
            }
        //convert response to string
        try{
              BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
               sb = new StringBuilder();
               sb.append(reader.readLine() + "\n");

               String line="0";
               while ((line = reader.readLine()) != null) {
                              sb.append(line + "\n");
                }
                is.close();
                result=sb.toString();
                }catch(Exception e){
                      Log.e("log_tag", "Error converting result "+e.toString());
                }
        //paring data
        int step_num;
        String description;
        try{
              jArray = new JSONArray(result);
              JSONObject json_data=null;
              for(int i=0;i<jArray.length();i++){
                     json_data = jArray.getJSONObject(i);
                     step_num=json_data.getInt("step_num");
                     description=json_data.getString("description");
                 }
              }
              catch(JSONException e1){
                  Toast.makeText(getBaseContext(), "No step found" ,Toast.LENGTH_LONG).show();
              } catch (ParseException e1) {
                    e1.printStackTrace();
            }

        //System.out.println(result);
        return result;
    }

    @Override
    protected String doInBackground(String... arg0) {
        // TODO Auto-generated method stub
        return null;
    }

}

然后在主线程中,我这样做了:

AsyncTask<String, Void, String> returnString = new RetrieveFeedTask().execute();

那么如何让这些信息在主线程中使用呢?

4

3 回答 3

3

你几乎可以接受,但有两个错误:

  1. 您正在重载永远无法调用的 doInBackground 方法。
  2. 在“当前”空的 doInBackground 实现中实现你的东西。

如果您想将数据恢复到主线程,您可以:

  1. 使用runOnUiThread方法
  2. 在您的活动中创建一个匿名内部类,它将扩展您的 asynctask 并覆盖onPostExecute方法。(在ui线程上运行)

:)

于 2012-06-10T10:45:08.260 回答
1

您可以创建一个以 JSON 格式返回所需数据的 Web 服务。把它放到你的服务器上。现在使用 android 调用该网络服务。这样你就可以从 PHP 获取数据到 android

于 2012-06-10T10:33:00.573 回答
0

在空的 doInBackground 块中实现您当前的代码

 @Override
protected String doInBackground(String... arg0) {
    // TODO Auto-generated method stub
    return null;
}

从上述方法返回的字符串,将在onPostExecute方法中接收,您也需要在代码中实现,目前实际上缺少。

于 2012-06-10T11:01:02.023 回答