for循环中运行doInBackground方法时未传递的数据

时间:2017-09-18 17:08:36

标签: android android-asynctask

我有一些照片要上传到ftp服务器,我正在使用Asynctask。图像需要发送到多个主机,所以我使用的是for循环。要传递的数据很好地被提取构造函数,但doInBackground方法没有运行,之前没有for循环运行得很好,除了我现在尝试传入的字符串 filePathName 之外的其他数据在doInBackground.please帮助我

class uploadTask extends AsyncTask<String, Void, String> {
    public uploadTask(String filePathName,String host_2,String user_2,String pass_2)
    {
        filePath=filePathName;
        host_1=host_2;
        user_1=user_2;
        pass_1=pass_2;
        Toast.makeText(getBaseContext(),"FTP DATA RECEIVING:"+"HOST:"+host_2+" USERNAME:"+user_2+" PASS:"+pass_2,Toast.LENGTH_LONG).show();
        //hostName=host;
    }
    @Override
    protected String doInBackground(String... params) {
        try {

            Toast.makeText(getBaseContext(),"Entered Do in Background Method to upload",Toast.LENGTH_SHORT).show();
            ftp_host = "ftp.photoshelter.com";//This is not the correct way. Supposed to get from Backendless table
            ftp_username = "brytest";//This is not the correct way. Supposed to get from Backendless table
            ftp_password = "passtest";//This is not the correct way. Supposed to get from Backendless table
            Toast.makeText(getBaseContext(),"HOST:"+ftp_host+" USERNAME:"+ftp_username+" PASS:"+ftp_password,Toast.LENGTH_LONG).show();
            news_agency = "news agency";
            easyFTP ftp = new easyFTP();
            ftp.connect(ftp_host, ftp_username, ftp_password);
            status = ftp.setWorkingDirectory("mem/images"); // if User say provided any Destination then Set it , otherwise
            // Upload will be stored on Default /root level on server
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            String imageTimeStamped = ftp_username + "_" + timeStamp + ".png";
            FileInputStream is = new FileInputStream(imageFileLocation);
            //addPhotoGrapherInfo();

            ftp.uploadFile(is, imageTimeStamped);
            System.out.println("Successfull ftp upload to " + ftp_host);
            Toast.makeText(getBaseContext(), "Photo uploading by ftp to " + ftp_host, Toast.LENGTH_LONG).show();
        //}
                //reset booleans
                //cameraPicTaken = false;
                //galleryImageSelected = false;
                //System.out.println("reset cameraPicTaken and galleryImageSelected");
           // }
                return new String("Upload Successful");
        }catch (Exception e){
            String t="Failure : " + e.getLocalizedMessage();
            return t;
        }
    }
}

带有for循环的onClickListener

 if(cameraPicTaken || galleryImageSelected) {
                Toast.makeText(SubmitActivity.this,"Image Location is:"+ imageFileLocation,Toast.LENGTH_LONG).show();
                //addPhotoGrapherInfo();
                for(int i=0;i<Common.selectedHostArray.size();i++) {
                    uploadFile(imageFileLocation,Common.selectedHostArray.get(i),Common.selectedUsernameArray.get(i),Common.selectedPasswordArray.get(i));
                }
                cameraPicTaken = false;
                galleryImageSelected = false;
            }
在onClick中调用的函数

public void uploadFile(String filePath,String host_1,String user_1,String pass_1)
{
    if(cameraPicTaken == true) {
        System.out.println("camera photo start upload");
        //for(int i=0;i<Common.selectedHostArray.size();i++) {
            //host_1=Common.selectedHostArray.get(i);
            //user_1=Common.selectedUsernameArray.get(i);
            //pass_1=Common.selectedPasswordArray.get(i);
            //host_1="ftp.photoshelter.com";
            //user_1="brytest";
            //pass_1="passtest";
        Toast.makeText(getBaseContext(),"FTP DATA PASSING:"+"HOST:"+host_1+" USERNAME:"+user_1+" PASS:"+pass_1,Toast.LENGTH_LONG).show();
            new uploadTask(filePath,host_1,user_1,pass_1).execute();
       // }
        //cameraPicTaken = false;
        //galleryImageSelected = false;
        System.out.println("reset cameraPicTaken and galleryImageSelected");
      //cameraPicTaken = false;

    }
    if(galleryImageSelected == true){
        System.out.println("gallery image start upload");
        Toast.makeText(getBaseContext(),"FTP DATA PASSING:"+"HOST:"+host_1+" USERNAME:"+user_1+" PASS:"+pass_1,Toast.LENGTH_LONG).show();
        new uploadTask(filePath,host_1,user_1,pass_1).execute();
        //new uploadTask(filePat)h.execute();
        //galleryImageSelected = false;
    }

    Toast.makeText(getBaseContext(), "Photo uploading by ftp to photoshelter.com" /*+ news_agency*/, Toast.LENGTH_LONG).show();
}

1 个答案:

答案 0 :(得分:0)

您正尝试在后台线程(Toast)上执行UI命令。这会导致您的后台任务提前失败。由于您的后台任务会捕获自己的错误,因此它们会无声地失败。

@Override
protected String doInBackground(String... params) {
    try {
        // you can't Toast on a background thread, this should throw an exception
        Toast.makeText(getBaseContext(),"Entered Do in Background Method to upload",Toast.LENGTH_SHORT).show();
        ...
    }catch (Exception e){
        // your Toast exception is getting caught silently here
        String t="Failure : " + e.getLocalizedMessage();
        return t;
    }
}

顺便说一句,尝试/捕获一切都不是一个好习惯。你最终会遇到大量无声的失败,让你挠头并问为什么事情不起作用。