有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java安卓:从特定线程执行方法

我正在用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();
}

共 (2) 个答案

  1. # 1 楼答案

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

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

    final Handler successHandler = new Handler()
    {
        @Override
        public void handleMessage(Message message)
        {
            callback.Success(response);
        }
    };
    
    successHandler.sendEmptyMessage(0);
    
  2. # 2 楼答案

    对于大多数应用程序来说,在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
    }
    

    doInBackground方法将在操作系统管理的单独线程中运行。当该线程完成时,onPostExecute将在启动任务的线程上运行,该线程通常是UI线程

    如果需要设置回调对象,只需向HttpPostTask添加一个构造函数,并执行所需的任何初始化。然后,您的客户端代码只需要创建和执行任务:

    new HttpPostTask().execute();
    

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

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