[英]Android: Why won't this code run in onCreate, or how can I make it work without a thread?
我将这段代码放在Eclipse中时可以正常运行,但是由于某些原因,当我将其放在Android Studio中活动的onCreate方法中时,它不想执行。
这是代码:
public class ItemListView extends AppCompatActivity{
String itemURL;
int listSize;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_item_list_view);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Bundle itemData = getIntent().getExtras();
if(itemData==null){
return;
}
//Gets URL from search bar
itemURL = itemData.getString("itemURL");
try {
Document doc = Jsoup.connect("https://www.amazon.com/s/ref=nb_sb_ss_c_1_6?url=search-alias%3Daps&field-keywords=rx+390&sprefix=rx+390%2Caps%2C166&crid=2MTUBA4KGNY06").get();
String link = doc.select("h2#s-result-count").first().text();
System.out.println(link);
System.out.println(link.substring(1));
if (link.substring(1, 2).equals("-")) {
System.out.println("run1");
listSize = Integer.parseInt(link.substring(2, 3));
System.out.println(listSize);
try {
listSize = Integer.parseInt(link.substring(2, 4));
System.out.println(listSize);
} catch (Exception e) {
}
} else {
System.out.println("run2");
listSize = Integer.parseInt(link.substring(0, 1));
System.out.println(listSize);
try {
listSize = Integer.parseInt(link.substring(0, 2));
System.out.println(listSize);
} catch (Exception e) {
}
}
} catch (Exception e) {
}
System.out.println("listSize: " +listSize);
...
}
}
我需要listSize根据URL创建一个变量数组,但是当我打印该值以确保它正常工作时,它始终为我提供0。我曾尝试使用AsyncTask在单独的Java类中运行代码,并且可以工作,但是通过当代码在onPostExecute中执行时,为时已晚,因为上面的类已经尝试初始化数组。
任何建议,将不胜感激,谢谢!
您需要一个回调以允许您初始化变量onPostExecute
:
interface OnCallCompleteCallBack {
void onCallComplete(int listSize);
}
在您的AsyncTask
执行以下操作:
public class MyTask extends AsyncTask < ... > {
// Maintain a ref to callback
OnCallCompleteCallBack callback;
MyTask(OnCallCompleteCallBack callback) {
this.callback = callback;
}
...
@Override
protected void onPostExecute(Void aVoid) {
if (callback != null) {
callback.onCallComplete(listSize);
}
}
}
使您的Activity
实现OnCallCompleteCallBack
并像这样启动AsyncTask
:
new MyTask(this).execute();
然后,您可以在活动的onCallComplete()
实现中使用该值
在回答之前,请注意以下几点:
给您的活动ItemListView命名似乎是错误的(一个Activity
不是一个View
)。
您永远不要在UI线程上执行网络调用。
如果要登录,则应使用Log
而不是System.out.println()
。
现在回答。 您应该执行在AsyncTask
中获取数据的代码(如您所提到的那样)。 提取数据后,您应该更新数组,然后在onPostExecute()
更新UI。
Android使用MVC (模型-视图-控制器)模式可以很好地工作,而您的问题就是经典情况,您需要使用服务器中的数据来更新模型并相应地更新视图。 在这种情况下,活动代表控制器。
请仔细阅读android开发人员网站Android Developer中的主题,阅读“在单独的线程上介绍网络操作”部分-为了避免创建无响应的UI,请不要在UI线程上执行网络操作。 默认情况下,Android 3.0(API级别11)及更高版本要求您在除主UI线程之外的其他线程上执行网络操作; 如果不这样做,则会引发NetworkOnMainThreadException。
谢谢阿希什
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.