我正在尝试从我的活动文件的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());
}
答案 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
。