Java 等待带有异步任务的类完成

Java 等待带有异步任务的类完成,java,android,Java,Android,我试图制作一个小应用程序,从依赖于用户输入的服务器检索一些JSON 到目前为止,我有以下工作要做: 用户输入搜索词 应用程序查找搜索结果 我刚才遇到的问题是,一旦检索到结果,就解析主类中的数据 我的代码: 下面是重要的代码。我没有包括解析或检索数据的方法,因为这些方法确实有效 基本上,我需要一种方法来向调用我的ResultsGetter.getToday()方法的方法发送一个“完成”信号或其他东西,一旦数据检索完成,就像我尝试按原样访问数据时一样,由于数据还没有完成,所以它都是空的 主要活动

我试图制作一个小应用程序,从依赖于用户输入的服务器检索一些JSON

到目前为止,我有以下工作要做:

  • 用户输入搜索词
  • 应用程序查找搜索结果
我刚才遇到的问题是,一旦检索到结果,就解析主类中的数据

我的代码: 下面是重要的代码。我没有包括解析或检索数据的方法,因为这些方法确实有效

基本上,我需要一种方法来向调用我的ResultsGetter.getToday()方法的方法发送一个“完成”信号或其他东西,一旦数据检索完成,就像我尝试按原样访问数据时一样,由于数据还没有完成,所以它都是空的

主要活动

public class MainActivity extends Activity implements android.view.View.OnClickListener{

    ResultsGetter results;
        HttpClient client;

    EditText location;
    Button search;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        client = new DefaultHttpClient();

        location = (EditText) findViewById(R.id.etLocation);
        search = (Button) findViewById(R.id.btSearch);
        search.setOnClickListener(this);

        search= new ResultsGetter(
                this,
                0,
                "MY DATA URL",
                client);

    }

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub

    results.getToday(location.getText().toString());


    }



}
我的结果获取者课程

public class ResultsGetter {

public ResultsGetter(Context c, int f, String url, HttpClient client) {
        this.context = c;
        this.term = f;
        this.url = url;

        this.client = client;

    }

public void getToday(String location) {

        getData = new Reader();
        builtUrl = url + "?length=today&city=" + location;
        getData.execute();

}

public class Reader extends AsyncTask<String, Integer, JSONObject> {

        @Override
        protected JSONObject doInBackground(String... params) {
            // TODO Auto-generated method stub

            try {

                alldata = getData();

                return alldata;

            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                Log.e("Error", "CLIENT Exception " + e.toString());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                Log.e("Error", "IOException " + e.toString());
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                Log.e("Error", "JSON Exception " + e.toString());
            }

            return null;

        }




        @Override
        protected void onPostExecute(JSONObject result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            Log.e("Success", "JSON retrieved");
            parseData();

        }

    }

}
公共类结果获取程序{
公共结果获取程序(上下文c、int f、字符串url、HttpClient客户端){
this.context=c;
本项=f;
this.url=url;
this.client=client;
}
公共void getToday(字符串位置){
getData=newreader();
builtUrl=url+“?长度=today&city=“+位置;
getData.execute();
}
公共类读取器扩展异步任务{
@凌驾
受保护的JSONObject doInBackground(字符串…参数){
//TODO自动生成的方法存根
试一试{
alldata=getData();
返回所有数据;
}捕获(客户端协议例外e){
//TODO自动生成的捕捉块
Log.e(“错误”,“客户端异常”+e.toString());
}捕获(IOE异常){
//TODO自动生成的捕捉块
Log.e(“Error”、“IOException”+e.toString());
}捕获(JSONException e){
//TODO自动生成的捕捉块
Log.e(“错误”,“JSON异常”+e.toString());
}
返回null;
}
@凌驾
受保护的void onPostExecute(JSONObject结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
Log.e(“成功”,“检索到JSON”);
解析数据();
}
}
}

存储
AsyncTask
实例,然后在希望其停止执行时对其调用
cancel
,然后可以在
doInBackground
中选中
isCancelled()
提前结束。如果任务在完成之前被取消,
onPostExecute
将不会运行。

但是如何从我的主要活动中检查这一点?在这里我调用results.getToday()等。。。我想等到它完全完成后再继续,因为此时将检索数据,ResultGetter中的字符串变量将具有JSON数据的值。如果您想在
AsyncTask
完成后执行它,您需要从
onPostExecute
运行它。您可以为创建时传递给它的任务创建一个接口,该接口将在
活动
中定义,然后从
onPostExecute
调用接口中的特定方法。下面是我上面描述的一个示例: