从android中的非活动类调用活动方法

时间:2012-06-05 18:21:48

标签: java android android-asynctask

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

我在Activity中实例化该类的对象,以在单独的线程中执行http请求。线程执行时,我想调用Activity的方法。

我该如何实现?我需要Activity中http请求的结果,但到目前为止我无法解决这个问题。

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

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();
    }
}
}

3 个答案:

答案 0 :(得分:1)

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

as

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

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

......

答案 1 :(得分:0)

您不必执行onPostExecute(),因为在完成进程doInBackground之后调用它,然后您可以使用传递给AsyncTask构造函数的活动的引用来运行任何用户界面上方法的时间。

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

答案 2 :(得分:0)

请参阅此问题... can-i-put-asynctask-in-a-separate-class-and-have-a-callback以及接受的答案。如果您希望将可重复使用的AysncTask作为独立类,那么使用侦听器作为所有活动的回调是最好的方法。