我在项目中创建了一个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();
}
请考虑我需要使用此课程,直到它显示信息。你会建议什么?
答案 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");