[英]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.