0

我正在实现一个类,extends AsyncTask我在这个类中执行一个 http 请求。该类不是一个Activity并且位于一个单独的 java 文件中,因为我想多次使用这个类。

我在我的 中实例化了这个类的一个对象Activity,以在单独的线程中执行 http 请求。当线程执行时,我想调用我的Activity.

我该如何实施?我需要http请求的结果,Activity但到目前为止我无法处理。

这是线程任务的代码...

public class PostRequest extends AsyncTask<String, Void, String> {
public String result = "";

@Override
protected String doInBackground(String... urls) {
    try {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://bla/index.php?" + urls[0]);
        // httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        InputStream is = entity.getContent();

        // convert response to string
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        result = sb.toString();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return result;
}

@Override
protected void onPostExecute(String result) {

}
}

这是我Activity创建线程类的代码的一部分......

public class ListActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list);


    PostRequest task = new PostRequest();
    task.execute(new String[] { "action=getUsers" });
    task.onPostExecute(task.result) {

    }
}

public void Display(String result) {
    try {
        JSONArray jArray = new JSONArray(result);
        JSONObject json_data = jArray.getJSONObject(0);
        String value = json_data.getString("name");
        TextView text = (TextView) findViewById(R.id.value);
        text.setText(value);
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
}
4

3 回答 3

1

在构造函数中传递活动引用......

作为

public class PostRequest extends AsyncTask<String, Void, String> {
public String result = "";
private Activity mActivity;

 public PostRequest(Activity activity){
          super();
         mActivity = activity;
}

......
于 2012-06-05T18:24:59.540 回答
0

您不必执行此操作,onPostExecute()因为这是在流程doInBackground完成后调用的,然后您可以使用传递给 AsyncTask 的构造函数的活动的引用来在您的 UI 上运行任何时间的方法。

请记住,该onPostExecute()方法在 UI 线程上运行,因此您可以在此方法中根据需要尝试修改您的视图。

于 2012-06-05T18:25:21.477 回答
0

看到这个问题... can-i-put-asynctask-in-a-separate-class-and-have-a-callback和接受的答案。如果您想要一个可重用的AysncTask独立类,那么使用侦听器作为所有活动的回调是最好的方法。

于 2012-06-05T18:35:47.943 回答