我正在实现一个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();
}
}
}
答案 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
作为独立类,那么使用侦听器作为所有活动的回调是最好的方法。