经常使用asynctask

时间:2015-06-23 10:40:49

标签: android android-asynctask

我在项目中创建了一个AsyncTsak类,它从Web服务器下载了一些信息。我确信它运作良好,因为当onCreate()调用它时,我可以看到结果。但不幸的是,当我通过按钮再次调用它时它不起作用。

我不确定,但我想我已经在某处了解过这个问题。它说,我们只允许使用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();
        }

请考虑我需要使用此课程,直到它显示信息。你会建议什么?

3 个答案:

答案 0 :(得分:2)

扩展JVN关于AsyncTask的内容

每个Async任务实例只能执行一次。

  

该任务只能执行一次(如果尝试第二次执行则会抛出异常。)

http://developer.android.com/reference/android/os/AsyncTask.html(根据&#39;线程规则&#39;)

这并不能阻止你制作一个新实例 -

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

^上面的代码将运行你的任务两次。

您的代码看起来很好。 我猜这个问题是(按可能性排序)

1)点击“不工作”

2)Post Execute没有按预期工作

3)服务器响应未正确读取

4)您的服务器没有正确处理请求

  • 但如果您运行调试器或添加一些额外的日志输出
  • ,这将是显而易见的

答案 1 :(得分:1)

1)我认为你可以在课堂上只使用一次异步任务。但绝对可以多次调用它。

2)请检查按钮点击时是否真正调用了按钮onclicklistener()功能。尝试一些日志。

因为代码似乎很好。

答案 2 :(得分:0)

要允许多个asycnh任务同时运行,您需要使用&#39; executeOnExceuter机制:

请参阅Android doucmentation中的此说明:

  

首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改为一个线程池,允许多个任务并行运行。从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。

     

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

示例调用看起来像(这个特定示例来自视频操作应用程序 - &quot; distributionTask&#39;是扩展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");