【问题标题】:Calling method of activitiy from a non-activity class in android从android中的非活动类调用活动方法
【发布时间】:2012-06-05 18:21:48
【问题描述】:

我正在实现一个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();
    }
}
}

【问题讨论】:

    标签: java android android-asynctask


    【解决方案1】:

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

    作为

    public class PostRequest extends AsyncTask<String, Void, String> {
    public String result = "";
    private Activity mActivity;
    
     public PostRequest(Activity activity){
              super();
             mActivity = activity;
    }
    
    ......
    

    【讨论】:

    • 但是我现在如何访问这个活动的方法呢?我试过像 mActivity.Display();但这不起作用...到目前为止谢谢!
    • 要么使用你的活动名称来代替 PostRequest 函数中的活动,只需将活动类型转换为你的活动......
    • @DheereshSingh,谢谢,我认为类型转换为 Activity 就足够了,但你说得对,它应该被转换为真正的活动类。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2020-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-29
        • 2012-03-28
        • 2016-01-08
        • 1970-01-01
        相关资源
        最近更新 更多