等到具有异步任务的课程完成

时间:2013-09-30 10:46:22

标签: java android

我正在尝试创建一个小应用程序,从依赖于用户输入的服务器中检索一些JSON。

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

  • 用户输入搜索字词
  • App找到搜索结果

我刚刚遇到的问题是在检索到结果后解析主类中的数据。

我的代码: 以下是重要的代码。我没有包含解析或检索数据的方法,因为它们可以正常工作。

基本上我需要一种方法来发送一个“完成”信号或者什么东西给调用我的ResultsGetter.getToday()方法的方法一旦数据被检索完就像我尝试按原样访问数据,它就是全部null,因为数据尚未完成。

主要活动

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());


    }



}

我的ResultsGetter类

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();

        }

    }

}

1 个答案:

答案 0 :(得分:0)

存储AsyncTask实例,然后在您希望它停止执行时调用cancel,然后您可以检查isCancelled()中的doInBackground提前结束。如果任务在完成之前被取消,onPostExecute将无法运行。