簡體   English   中英

Android:為什么此代碼無法在onCreate中運行,或者如何在沒有線程的情況下使其運行?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM