2015-06-23 39 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日志输出