2013-07-14 69 views
0

我試圖在我的應用程序啓動時通過刮網站來檢索一些圖像URL和圖像文本。然後,我想使用由imageTexts和imageURLs創建的數組來創建ViewPager,以便將圖像顯示爲可滾動的圖庫。通過解析元數據網頁創建圖庫

我執行網絡任務,獲取網頁並將HTML解析爲AsyncTask(downloadTask(),代碼如下)。

我的問題是,因爲這發生在後臺,它沒有時間在代碼嘗試顯示圖像之前獲取和分析數據。我得到一個空指針錯誤代碼時碰到

新ViewPagerAdapter(這一點,getimageText(),getimageURLS())

我可以推斷,這最終應該存儲圖像的URL和數組圖片文字尚未創建。這是我的應用程序崩潰的時候。

這是我的代碼。我對Android和Java都很陌生,所以很清楚我可以做很多幫助!

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Get the view from viewpager_main.xml 
     setContentView(R.layout.viewpager_main); 

     // Fetch the list of URLs using a background network task 
     new downloadTask().execute(BASE_URL); 

     // Locate the ViewPager in viewpager_main.xml 
     viewPager = (ViewPager) findViewById(R.id.pager); 

     // Pass results to ViewPagerAdapter Class 
     adapter = new ViewPagerAdapter(this, getimageText(), getimageURLS()); 

     // Binds the Adapter to the ViewPager 
     viewPager.setAdapter(adapter); 

    } 

回答

2

您可以初始設置一個默認圖像,您可以修改您的asyncTask採取回調方法。這個回調方法將是一個初始化ViewPager的方法。在您的AsyncTask中,您將獲得圖像並覆蓋onPostExecute()方法來調用該回調方法。

class PictureGrabber extends AsyncTask<URL, VOID, VOID>{ 
IPicCallBack callBack; 
PictureGrabber(IPicCallBack callback) 
{ 
    this.callback = callback; 
} 

protected Void doInBackGround(URL... urls){ 
} 

protected void onPostExecute(VOID result) 
{ 
    callback.Init(); 
} 

public interface IPicCallBack{ 
    public void Init(); 
} 

然後在你的代碼,你需要實現IPicCallback,並設置它的的AsyncTask,當任務完成後,它會調用該方法

+0

感謝您的幫助。我最終退後一步,從另一個角度接近它。而不是在postExecute中放回一個回調函數,我把View Pager intialisation代碼放在​​那裏。無論如何inBackground任務完成後調用它,所以我沒有看到回調的需要。不過謝謝你的建議。它讓我讀了更多,這讓我清晰。 – piratemurray

+0

聽起來不錯。唯一的一點是,通過這個回調函數,你可以將所有的實例化代碼保存在一個地方,而不是遍及你的代碼。 –