Android 在一个活动中运行多个任务
我有一个代码,可以读取我的收件箱,并将每次读取的短信作为一个单独的文件存储在一个固定的文件夹中,我需要稍后通过FTP上传。我使用的FTP上传的意图。我的程序结构类似于:onCreate->Method1收件箱读取->删除收件箱消息->Method2上传FTP->Method3删除上传的文件夹->进一步的任务问题是,在应用程序上传文件夹内容之前会调用进一步的任务,而服务器只是断开连接。在后续任务中,我尝试在处理程序的帮助下调用Method3,延迟设置为10分钟,但没有帮助,因为上传可能需要更多的时间,而且可能根本没有任何文件要上传,所以这10分钟是浪费的。我希望应用程序等到上传完成。所以问题是:这样做的正确方式是什么? 编辑: 我正在使用的代码:Android 在一个活动中运行多个任务,android,ftp,Android,Ftp,我有一个代码,可以读取我的收件箱,并将每次读取的短信作为一个单独的文件存储在一个固定的文件夹中,我需要稍后通过FTP上传。我使用的FTP上传的意图。我的程序结构类似于:onCreate->Method1收件箱读取->删除收件箱消息->Method2上传FTP->Method3删除上传的文件夹->进一步的任务问题是,在应用程序上传文件夹内容之前会调用进一步的任务,而服务器只是断开连接。在后续任务中,我尝试在处理程序的帮助下调用Method3,延迟设置为10分钟,但没有帮助,因为上传可能需要更多的时
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ReadnDeleteSMS();
}
public void FTPUpload(){ //FTPUpload via ANDFTP app
Intent intent = new Intent();
intent.setAction(Intent.ACTION_PICK);
Uri ftpUri = Uri.parse("Server"); //Server Call
intent.setDataAndType(ftpUri, "vnd.android.cursor.dir/lysesoft.andftp.uri");
intent.putExtra("command_type", "upload");
intent.putExtra("ftp_username", "username");
intent.putExtra("ftp_password", "password");
intent.putExtra("ftp_pasv", "true");
intent.putExtra("ftp_resume", "true");
intent.putExtra("ftp_encoding", "UTF-8");
intent.putExtra("progress_title", "Uploading folder ...");
intent.putExtra("local_file1", "/sdcard/ReceivedSMS");
intent.putExtra("remote_folder", "remote folder");
intent.putExtra("close_ui", "true"); //Finally start the Activity
startActivityForResult(intent, RESULT_OK); i++;
customHandler.postDelayed(finalizer, 10*60*1000);}
public void ReadnDeleteSMS(){ //Reads, BackUps and Deletes Inbox Messages
Cursor cursor1 = getContentResolver().query(Uri.parse("content://sms/inbox"), null, null, null, null);
if (cursor1.getCount() > 0) {
while (cursor1.moveToNext()){
int id = cursor1.getInt(0);
String address = cursor1.getString(cursor1.getColumnIndex("address"));
String date = cursor1.getString(cursor1.getColumnIndex("date"));
String SMSDate = DateConversion(date);
String msg = cursor1.getString(cursor1.getColumnIndex("body"));
ReadSMS = address + "\n" + SMSDate + "\n" + msg + "\n";
FileName(zText);
myDate = zText.toString(); zText = new StringBuilder();
fileWrite("/sdcard/ReceivedSMS/" + myDate, ReadSMS);
try{
getApplicationContext().getContentResolver().delete(Uri.parse("content://sms/" + id), null, null);
Toast.makeText(getBaseContext(), "Successfully Deleted", Toast.LENGTH_SHORT).show();}
catch(Exception e){
Toast.makeText(getBaseContext(), "Error Deleting", Toast.LENGTH_SHORT).show();}}}
FTPUpload();}
public String DateConversion (String date){ //Proper Date Format Display
Long timestamp = Long.parseLong(date);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timestamp);
return calendar.getTime().toString();}
public void FileName(StringBuilder zText) { //Inbox Message File Name
SimpleDateFormat mSDF = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
myDate = mSDF.format(new Date());
myDate = myDate.replace(" ", "");
myDate = myDate.replace("/", "");
myDate = myDate.replace(":", "");
myDate = myDate.replace(".", "");
zText.append(myDate);}
public Runnable finalizer = new Runnable(){ //Main Handler
public void run(){
if (i > 0)
{DeleteDirectory("/sdcard/ReceivedSMS"); i = 0;}
//Some Further Tasks
}
这些进一步的任务需要经常调用,但如果正在执行上载,则不必执行此类任务。任务包括阅读网页、编辑字符串等。这些是我的应用程序的主要任务。如果不发布一些用于执行此过程的代码,则很难帮助您完成此过程,但如果您的问题是必须等到一项任务完成后才能启动另一项任务,那么这似乎是sendBroadcast和BroadcastReceiver的工作 实例 假设您在服务中处理ftp上载的逻辑,为简单起见,此逻辑可能位于AsyncTask或任何类似的任务上:
public class RefreshService extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
// Backgroud process here
// ...
// When the task is completed
sendBroadcast(new Intent("com.example.action.REFRESH_COMPLETED"));
}
}
}
为了捕获com.example.action.REFRESH\u已完成,您必须提供一个广播接收器
您还必须声明这个类应该捕获您之前定义的特定操作。为此,请更新您的清单并包括接收者:
...
<service
android:name=".RefreshService"
android:exported="false" >
</service>
<receiver android:name=".RefreshCompletedReceiver" >
<intent-filter>
<action android:name="com.example.action.REFRESH_COMPLETED" />
</intent-filter>
</receiver>
...
就这样。BroadcastReceiver中的代码将在后台进程完成后执行。请记住,您需要处理进程中断或类似的网络错误,并且仅在操作成功时调用sendBroadcast。
附加信息
您可以在中使用registerReceiver动态注册接收器,但通常必须在活动的onDestroy方法中取消注册,否则您的应用程序将崩溃并查看引用。
在这类问题上帮了我很多忙。
还要检查以在服务和异步任务之间进行选择。
查看文档和,以了解关于这两个方面的更多信息。
免责声明
我刚开始用android编程,所以可能还有其他方法可以做到这一点,我发现这种方法很容易理解和实现。我已经编辑了这个问题,添加了我的代码。我看不出用当前代码添加接收器的方法。我不知道。我自己也是android新手。感谢所有的帮助:在我看来,FTPUpload将是一个经常性的任务,因此您需要的是一个IntentService,就像示例中的want一样,它在后台等待请求,在其方法onhandle中,您将在FTPUpload中执行您正在执行的操作,而不需要postDelayed。在onHandle意图的最后一行中,您使用sendBroadcast通知任务已完成,并在Receiver类中执行ReadnDeleteSMS中的逻辑。这样,您的UI活动就不会阻塞,您只会在流程成功时执行清理方法。检查我提供的链接。
...
<service
android:name=".RefreshService"
android:exported="false" >
</service>
<receiver android:name=".RefreshCompletedReceiver" >
<intent-filter>
<action android:name="com.example.action.REFRESH_COMPLETED" />
</intent-filter>
</receiver>
...