Java Android:从特定线程执行方法

Java Android:从特定线程执行方法,java,android,Java,Android,我正在用Android开发一个应用程序。应用程序可以向特定的web服务器发布HTTP请求。该post请求必须异步运行,因此我创建了一个线程来执行该任务。但我需要一个回调,它将在线程结束时调用,并且必须从调用'post'方法的线程调用它 我的post方法如下所示: interface EndCallback { public void Success(String response); public void Fail(Exception e); } public void po

我正在用Android开发一个应用程序。应用程序可以向特定的web服务器发布HTTP请求。该post请求必须异步运行,因此我创建了一个线程来执行该任务。但我需要一个回调,它将在线程结束时调用,并且必须从调用'post'方法的线程调用它

我的
post
方法如下所示:

interface EndCallback
{
    public void Success(String response);
    public void Fail(Exception e);
}

public void post(final String url, final List<NameValuePair> data, EndCallback callback)
{
    Thread t = Thread.currentThread();
    (new Thread()
    {
        public void run()
        {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(url);
            try
            {
                httppost.setEntity(new UrlEncodedFormEntity(data));
                HttpResponse r = httpclient.execute(httppost);

                HttpEntity en = r.getEntity();
                String response = EntityUtils.toString(en);

                //I want to call callback.Success(response)
                //here from thread t
            } 
            catch (Exception ex)
            {
                //And I want to call callback.Fail(ex)
                //here from thread t
            }
        }
    }).start();
}
接口端回调
{
公共无效成功(字符串响应);
公共无效失败(例外e);
}
公共void post(最终字符串url、最终列表数据、EndCallback)
{
Thread t=Thread.currentThread();
(新线程()
{
公开募捐
{
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(url);
尝试
{
setEntity(新的UrlEncodedFormEntity(数据));
HttpResponse r=httpclient.execute(httppost);
HttpEntity en=r.getEntity();
字符串响应=EntityUtils.toString(en);
//我想呼叫callback.Success(响应)
//这里来自线程t
} 
捕获(例外情况除外)
{
//我想调用callback.Fail(ex)
//这里来自线程t
}
}
}).start();
}

您可能需要使用处理程序。处理程序用于将请求发布到GUI线程

要成功处理,请使用以下代码:

final Handler successHandler = new Handler()
{
    @Override
    public void handleMessage(Message message)
    {
        callback.Success(response);
    }
};

successHandler.sendEmptyMessage(0);

您可能需要使用处理程序。处理程序用于将请求发布到GUI线程

要成功处理,请使用以下代码:

final Handler successHandler = new Handler()
{
    @Override
    public void handleMessage(Message message)
    {
        callback.Success(response);
    }
};

successHandler.sendEmptyMessage(0);

对于大多数应用程序来说,在Android上创建新线程是非常不受鼓励的。这似乎是一个完美的地方。它具有在线程之间切换的内置方法,无需手动管理线程创建

我在类似情况下使用的一种方法是将任务与可能成功状态的
enum
相结合:

class HttpPostTask extends AsyncTask<Void, Void, ResponseStatus> {

    @Override
    protected ResponseStatus doInBackground( Void... params ){

        try {
            // do your HTTP stuff
            return ResponseStatus.SUCCESS;
        } catch( Exception e ){
            return ResponseStatus.FAILURE;
        }

    }

    @Override
    protected void onPostExecute( ResponseStatus status ){
        switch( status ){
        case SUCCESS:
            // run your success callback
            break;
        case FAILURE:
            // run the failure callback
            break;
        }
    }

}

enum ResponseStatus {
    SUCCESS,
    FAILURE
}
您还可以将参数传递到
execute()
中,它接受类签名中第一个泛型类型的变量数。
doInBackground
中的
params
变量是一个传递到execute的数组,所有这些都是相同类型的


将参数传递到
execute
中非常有用,例如,如果您想发布到多个URL。对于大多数依赖项,在构造函数中设置它们是最简单的方法。

对于大多数应用程序,强烈建议不要使用Android创建新线程。这似乎是一个完美的地方。它具有在线程之间切换的内置方法,无需手动管理线程创建

我在类似情况下使用的一种方法是将任务与可能成功状态的
enum
相结合:

class HttpPostTask extends AsyncTask<Void, Void, ResponseStatus> {

    @Override
    protected ResponseStatus doInBackground( Void... params ){

        try {
            // do your HTTP stuff
            return ResponseStatus.SUCCESS;
        } catch( Exception e ){
            return ResponseStatus.FAILURE;
        }

    }

    @Override
    protected void onPostExecute( ResponseStatus status ){
        switch( status ){
        case SUCCESS:
            // run your success callback
            break;
        case FAILURE:
            // run the failure callback
            break;
        }
    }

}

enum ResponseStatus {
    SUCCESS,
    FAILURE
}
您还可以将参数传递到
execute()
中,它接受类签名中第一个泛型类型的变量数。
doInBackground
中的
params
变量是一个传递到execute的数组,所有这些都是相同类型的


将参数传递到
execute
中非常有用,例如,如果您想发布到多个URL。对于大多数依赖项,在构造函数中设置它们是最简单的方法。

完美答案。。。但是,我可以将参数传递到
execute()
方法中吗?或者我必须将这些参数传递给构造函数?@NiyokoYuliawan-是的,我刚刚更新了答案的结尾。完美答案。。。但是,我可以将参数传递到
execute()
方法中吗?或者我必须将这些参数传递到构造函数?@NiyokoYuliawan-是,我刚刚更新了答案的结尾。有关许多选项,请参阅,包括处理程序、异步任务或将可运行实例发布到活动或视图。有关许多选项,请参阅,包括处理程序、异步任务或将可运行实例发布到活动或视图。