在Java类中访问变量时出现问题

时间:2019-06-20 09:04:00

标签: java android

我正在尝试从我的活动文件的onCreate方法访问类DownloadTask中的变量ArrayofTaxiDrivers。但是,以这种方式访问​​时变量为空。从DownloadTask的onPostExecute方法中访问时,内容确实显示。

非常感谢您的帮助!

public class DownloadTask extends AsyncTask<String,Void,String> {

        ArrayList<TaxiDriver> ArrayofTaxiDrivers = new ArrayList<TaxiDriver>();

        @Override
        protected String doInBackground(String... urls) {
          String result = "";
          URL url;
          HttpURLConnection urlConnection = null;

          try {

            url = new URL(urls[0]);
            urlConnection = (HttpURLConnection) url.openConnection();
            InputStream in = urlConnection.getInputStream();
            InputStreamReader reader = new InputStreamReader(in);
            int data = reader.read();

            while (data != -1) {
                char current = (char) data;
                result += current;
                data = reader.read();
            }

            return result;

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
      }
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            try {
                JSONObject jsonObject = new JSONObject(s);
                JSONArray items = jsonObject.getJSONArray("items");
                DownloadTask task = new DownloadTask();
                for(int i=0; i<items.length(); i++) {
                    JSONObject itemsObject = items.getJSONObject(i);
                    JSONObject fields = itemsObject.getJSONObject("fields");

                    task.addTaxiDriver(new TaxiDriver(fields.getString("name"), fields.getString("contact")));(asList(fields.getString("name"), fields.getString("contact"))));
                }
                Log.i("info",task.ArrayofTaxiDrivers.toString());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

}

protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_taxi_main);

        DownloadTask task = new DownloadTask();
        task.execute("https://test.com/json");

        Log.i("info",task.ArrayofTaxiDrivers.toString());
}

2 个答案:

答案 0 :(得分:0)

致电时 task.execute("https://test.com/json"); 任务将根据其优先级执行。因此,onPostExecute将在一段时间后(可能在onCreate

之后)被调用
Log.i("info",task.ArrayofTaxiDrivers.toString());

我建议您认为“执行”是一条立即退出且仅在一段时间后将被执行的指令。

答案 1 :(得分:0)

  

我正在尝试访问此类中的变量ArrayofTaxiDrivers   从我的onCreate的{​​{1}}方法中下载DownloadTask。

这是因为创建Activity时,DownloadTask List被初始化,而此时ArryofTaxiDrivers的大小为零。

如果您在List方法中拥有数据,则意味着它可能是由onPostExecute()的{​​{1}}方法添加的。可能完全取决于您的代码。

现在AsyncTask是异步工作的:这意味着尽管被踢开开始执行,但它不会立即启动。但是它将最终开始执行。

因此,当您访问doInBackground()的{​​{1}}中的列表时,该列表没有任何数据,因为您尚未添加该数据。

您应该做什么

相反,应实施AsyncTask / onCreate()来通知Activity数据已加载并准备使用。此回调可以来自interface