我的应用程序具有FTP功能,现在我想为各种操作实现ProgressDialog(连接,下载,上传,文件列表等) 我在堆栈上发现了这个片段,这似乎是一个很好的起点。
public class LoadData extends AsyncTask<Void, Void, Void> {
ProgressDialog progressDialog;
//declare other objects as per your need
@Override
protected void onPreExecute()
{
progressDialog= ProgressDialog.show(FTPConnector.this, "Please wait for ","Process Description Text", true);
//do initialization of required objects objects here
};
@Override
protected Void doInBackground(Void... params)
{
//do loading operation here
return null;
}
@Override
protected void onPostExecute(Void result)
{
super.onPostExecute(result);
progressDialog.dismiss();
};
}
我已经将它实现为我的FTPConnector类的子类,其中包含连接,下载,上传,列表文件,重命名,删除的各种方法。我是否需要为每个FTP操作创建ASyncTask的子类?如果不是我能做什么?
答案 0 :(得分:2)
我是否需要为每个FTP操作创建ASyncTask的子类?
不一定,但这取决于您在AsyncTask
方法中使用的逻辑。如果你让它们来处理操作所需的功能那么你就可以了。但是,根据每个操作的逻辑,如果为每个操作创建一个单独的类,则可能更容易控制。
但请注意,根据Docs
,每次需要致电execute()
时,您都需要创建一个新实例
该任务只能执行一次(如果尝试第二次执行则会抛出异常。)
答案 1 :(得分:2)
首先,我认为使用AsyncTask作为活动的子类是不受欢迎的,因为任务将保留对启动它的活动的引用,这可能会导致问题。我通常使用AsyncTask作为自己的类,并在执行它的活动的上下文中传递。你应该研究一下。
其次,您可以为每个服务器事务执行不同的任务。我想这取决于你的应用程序的数量或复杂程度。除此之外,您可以在doInBackground方法中使用一个带有switch语句的类,并将字符串标记作为其中一个varargs传递(假设您的任务仅将字符串作为初始参数)。这看起来既麻烦又难看。
我可能只为每笔交易做一个任务。
答案 2 :(得分:1)
使用AsyncTask进行多个事务将起作用,但这不是正确的解决方案。如前所述:它可能会导致问题。我建议你看看this video(这是关于REST客户端,但描述的模式也适合你)。遵循以下规则: