5

我需要向 PHP 服务器发送一个文件和一些数据。我为此使用一个线程和一个每 15 分钟执行一次的服务。当网络可用时它工作正常。但是当不在网络中时它停止发送文件(如果文件的大小相对较大)。在应用日志后,我看到,没有获取来自服务器的响应。它得到了 struk。此外,它在第一次尝试发送文件时发送 Unknownhost 异常。什么可以是问题吗?请帮忙。

这是代码: -

public void run(){


    while (keepRunning){
        isRunning = true;

        SystemClock.sleep(900000);



        File tempFile = new File(Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/", "barcode_log");
        File tempFile1 = new File(Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/", "data_log.txt");


        if(tempFile.exists())
        {           

        Log.d(TAG," in keep running");  

        String[] files =  (new File(Environment.getExternalStorageDirectory() + PATH)).list();

        Log.d(TAG," below file list");  

        SimpleDateFormat df3 = new SimpleDateFormat("yyyyMMdd_HHmmss");
        Date curDate = new Date();
        String s= "data_log";//df3.format(curDate);


        Log.d("log",files[0]);


        File file = new File(Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/","barcode_log");

        String new_file_name =s+".txt";
        // File (or directory) with new name
        File file2 = new File(Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/",new_file_name);
        // Rename file (or directory)
        if(!tempFile1.exists()){

            boolean success = file.renameTo(file2);
            Log.d(TAG," file name created");


            if (success) {
                // File was not successfully renamed

                Log.d(TAG," file rename success");
            }
            else
            {
                Log.d(TAG," file not rename success");
            }
        } 

        ts.writeBarcodeToFile(" S L", "");
        HttpURLConnection connection = null;
        DataOutputStream outputStream = null;
        DataInputStream inputStream = null;

        String pathToOurFile = Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/"+new_file_name;//zipName;
        String urlServer = "http://xyz.com/xyz.php?fname="+s+".txt";
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary =  "V2ymHFg03ehbqgZCaKO6jy";

        int bytesRead, bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 2*1024*1024;

        FileInputStream fileInputStream=null;

        try
        {


        ts.writeBarcodeToFile(" in try sl", "");
        fileInputStream = new FileInputStream(new File(pathToOurFile) );

        InetAddress iAddr = InetAddress.getByName("http://xyz.com");
        URL url = new URL(urlServer);
        connection = (HttpURLConnection) url.openConnection();

        // Allow Inputs & Outputs
        connection.setDoInput(true);
        connection.setDoOutput(true);
        connection.setUseCaches(false);

        // Enable POST method
        connection.setRequestMethod("POST");

        connection.setRequestProperty("Connection", "Keep-Alive");
        connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);

        connection.setConnectTimeout(20000);

        outputStream = new DataOutputStream( connection.getOutputStream() );
        outputStream.writeBytes(twoHyphens + boundary + lineEnd);
        outputStream.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + pathToOurFile +"\"" + lineEnd);
        outputStream.writeBytes(lineEnd);




        bytesAvailable = fileInputStream.available();
        bufferSize = Math.min(bytesAvailable, maxBufferSize);
        buffer = new byte[bufferSize];

        // Read file
        bytesRead = fileInputStream.read(buffer, 0, bufferSize);

        ts.writeBarcodeToFile("before while sl ", "");
        while (bytesRead > 0)
        {
        outputStream.write(buffer, 0, bufferSize);
        bytesAvailable = fileInputStream.available();
        bufferSize = Math.min(bytesAvailable, maxBufferSize);
        bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        }

        outputStream.writeBytes(lineEnd);
        outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

        ts.writeBarcodeToFile("after while sl ", "");
        // Responses from the server (code and message)

        try{
        int serverResponseCode = connection.getResponseCode();
        String serverResponseMessage = connection.getResponseMessage();
        if(serverResponseCode==200)
        {
            ts.writeBarcodeToFile("in if server response ", "");
            //ts.writeBarcodeToFile("L S", ""); 
            tempFile1.delete();
        }
        else
        {
            ts.writeBarcodeToFile("in else server response ", "");
            ts.writeBarcodeToFile(serverResponseCode+"", "");

        }

        }
        catch(Exception e)
        {
            try{

                outputStream.flush();
                outputStream.close();
                }
                catch(Exception ex)
                {

                }

            ts.writeBarcodeToFile("in url catch response "+e.toString(), "");
            connection.disconnect();

        }

        ts.writeBarcodeToFile("after server  sl ", "");
        fileInputStream.close();
        outputStream.flush();
        outputStream.close();
        ts.writeBarcodeToFile("after close  sl ", "");
        }
        catch (java.net.SocketTimeoutException e) {
            try{
                fileInputStream.close();
            outputStream.flush();
            outputStream.close();
            }
            catch(Exception ex)
            {

            }
            ts.writeBarcodeToFile("in socketex  sl "+e.toString(), "");
            connection.disconnect();
            } 
        catch (java.io.IOException e) 
            {
            try{
                fileInputStream.close();
                outputStream.flush();
                outputStream.close();
                connection.disconnect();
                }
                catch(Exception ex)
                {

                }
            ts.writeBarcodeToFile("in ioex  sl "+e.toString(), "");

            }
        catch (Exception ex)
        {
            try{
                fileInputStream.close();
                outputStream.flush();
                outputStream.close();
                }
                catch(Exception exy)
                {

                }
            ts.writeBarcodeToFile("in catch  sl "+ex.toString(), "");
            connection.disconnect();
        //Exception handling
        }

        //System.gc();
        }




    }
    isRunning = false;
}
4

3 回答 3

3

此问题与连接有关。我也看到当我们在 wifi 上时,我们没有遇到未知主机异常错误(除非我拔下设备)。当设备仅在 3g/4g 上时,我们遇到了未知的主机异常错误。

您可以尝试使用 HTTP上传类似线程恢复上传的可恢复支持吗?

或编写您自己的协议(块上传)。

于 2013-01-25T06:05:22.270 回答
1

You need to use AsyncTask for network operations for android versions 3.x and above..You can not use network operations in main thread....and If file size is big you may have to use wake_lock on service....and if network is not available than simply close your AsyncTask and than again check after 15 min as you are saying in service...use this code for checking network availability in AsyncTask

public boolean isOnline() {
   if(MyService.CONTEXT !=null){
       ConnectivityManager cm = (ConnectivityManager) MyService.CONTEXT.getSystemService(Context.CONNECTIVITY_SERVICE);
       NetworkInfo netInfo = cm.getActiveNetworkInfo();
       if (netInfo != null && netInfo.isConnectedOrConnecting()) {
       return true;
       }
    }
  return false 
}
于 2013-01-21T10:21:39.840 回答
1

Android 更高版本必须要快得多。最好在免费方法中使用AsynTaskdo。

protected class GetTask extends AsyncTask<Void, Void, Integer> {

    protected void onPreExecute() {
        mProgressDialog = ProgressDialog.show(MainActivity.this,
                "Loading", "Please wait");
    }

    @Override
    protected Integer doInBackground(Void... params) {
        // TODO Auto-generated method stub

        /// Do your stuf

        return 0;
    }

    protected void onPostExecute(Integer result) {
        super.onPostExecute(result);

    }
}

我遇到了同样的问题。我在后台使用过现在工作正常

于 2013-01-25T07:49:01.617 回答