2015-06-23 38 views
-1

我在我的項目中創建了一個AsyncTsak類,它從Web服務器下載一些信息。我相信它的效果很好,因爲當它被onCreate()調用時,我可以看到結果。但不幸的是,當我通過按鈕再次調用它時,它不起作用。頻繁使用asynctask

我不確定,但我想我已經讀過關於這個問題的地方。它說,我們被允許只使用一次AsyncTask類。

AsyncTask class

class DownloadAdvertismentLevel2 extends AsyncTask<String,String,String>{ 
    String [] ImageInformation=null; 
    protected void onPreExecute(){   
      // do nothing !    
     } 
    protected String doInBackground(String...Urls){ 
     String Data=""; 
     HttpURLConnection urlConnection = null; 
     try{ 
      URL myUrl=new URL("http://10.0.2.2:80/Urgence/ads.aspx?Action=DownloadIds&TB="+TopBoundry+"&LB="+LowBoundry); 
      urlConnection = (HttpURLConnection)myUrl.openConnection();  
      BufferedReader in = new BufferedReader (new InputStreamReader(urlConnection.getInputStream()));   
      String temp=""; 
      // Data is used to store Server's Response 
      while((temp=in.readLine())!=null) 
      {    
       Data=Data+temp;   
      }  
     } 
     catch(Exception ex){ 
      Log.d("Er>doInBackground", ex.toString()); 
      urlConnection.disconnect(); 
     } 
     finally{ 
      urlConnection.disconnect(); 
      } 
      return Data;// it sends Result to onPostExcute 
     } 
     protected void onPostExecute(String Data){ 
      createPhotoAlbum(); 
      pb.closedProg(); 
      }   
     } 

onCreate

在這裏,我沒有任何問題。它工作正常

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.ads);  
     new DownloadAdvertismentLevel2().execute(); 
    } 

Via Button

ButtonSeeMore.setOnClickListener(new View.OnClickListener(){ 
       public void onClick(View view) { 
        Counting(); 
       }}); 

Counting

public void Counting(){ 
      if(TotalRows-6>0){ 
       TopBoundry=TotalRows; 
       LowBoundry=TotalRows-6; 
       TotalRows=LowBoundry; 
       } 
      new DownloadAdvertismentLevel2().execute(); 
     } 

請考慮,我需要直到它顯示的信息來使用這個類。你會建議什麼?

回答

1

1)我想你可能只能在課堂上使用一次異步任務。但絕對可以多次調用。

2)請檢查您的按鈕onclicklistener()功能是否真的被按下按鈕點擊。嘗試一些日誌。

因爲代碼似乎很好。

0

要允許多個asycnh任務,你需要使用「executeOnExceuter機制同時運行:

當第一次推出,AsyncTasks進行系列上執行:

從Android doucmentation見本說明一個後臺線程。從DONUT開始,將其更改爲允許多個任務並行操作的線程池。從HONEYCOMB開始,任務在單個線程上執行,以避免並行執行導致的常見應用程序錯誤。

如果您真的想要並行執行,可以使用THREAD_POOL_EXECUTOR調用executeOnExecutor(java.util.concurrent.Executor,Object [])。

一個例子調用看起來像(這個特殊的例子是從視頻處理應用程序 - 在「distributionTask」是擴展AsynchTask一個類的實例):

//Now execute synch task - to allow multiple AsynchTasks execute in parallel the 
//'executeOnExecutor' call is required. It needs to be used with caution to avoid the usual synchronization issues and also 
//to avoid too many threads being created 
distributionTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, Environment.getExternalStorageDirectory() + "/videoChunk_"+i+".mp4"); 
2

要展開什麼JVN說關於AsyncTask

Async任務的每個實例只能執行一次。

該任務只能執行一次(如果嘗試執行第二次執行,則會引發異常。)

http://developer.android.com/reference/android/os/AsyncTask.html(在 '穿透規則')

這不會阻止你做一個新的實例 -

public void Counting(){ 
      if(TotalRows-6>0){ 
       TopBoundry=TotalRows; 
       LowBoundry=TotalRows-6; 
       TotalRows=LowBoundry; 
       } 
      new DownloadAdvertismentLevel2().execute(); 
      new DownloadAdvertismentLevel2().execute(); 
     } 

^上面的代碼將運行任務的兩倍。

你的代碼看起來不錯。 我猜想,這個問題是(以可能性順序)

1)點擊時無法正常工作

2)後執行不按預期工作

3)服務器響應ISN 「T被正確讀取

4)您的服務器不處理該請求正確

  • 但是,如果您運行調試器,這將是顯而易見的,或添加一些前tra日誌輸出