2015-04-17 36 views
-1

我使用异步任务在服务器上传图像,最后我想返回上传的文件url的值。我怎样才能做到这一点 我打电话的AsyncTask作为如何从android中的异步任务获得filleUploadedloaded URL作为字符串

new Config.UploadFileToServer(loginUserInfoId, uploadedFileURL).execute(); 

和我的AsyncTask函数为:

public static final class UploadFileToServer extends AsyncTask<Void, Integer, String> { 

      String loginUserInfoId = ""; 
      String filePath = ""; 
      long totalSize = 0; 
      public UploadFileToServer(String userInfoId, String url){ 
       loginUserInfoId = userInfoId; 
       filePath = url; 
      } 

      @Override 
      protected void onPreExecute() { 
       // setting progress bar to zero 
       super.onPreExecute(); 
      } 

      @Override 
      protected void onProgressUpdate(Integer... progress) { 
       // Making progress bar visible 

       // updating progress bar value 
      } 

      @Override 
      protected String doInBackground(Void... params) { 
       return uploadFile(); 
      } 

      @SuppressWarnings("deprecation") 
      private String uploadFile() { 
       String responseString = null; 

       HttpClient httpclient = new DefaultHttpClient(); 
       HttpPost httppost = new HttpPost(Config.HOST_NAME +  "/AndroidApp/AddMessageFile/"+loginUserInfoId); 

       try { 
        AndroidMultiPartEntity entity = new AndroidMultiPartEntity(
          new AndroidMultiPartEntity.ProgressListener() { 

           @Override 
           public void transferred(long num) { 
            publishProgress((int) ((num/(float) totalSize) * 100)); 
           } 
          }); 

        File sourceFile = new File(filePath); 

        // Adding file data to http body 
        entity.addPart("file", new FileBody(sourceFile)); 

        totalSize = entity.getContentLength(); 
        httppost.setEntity(entity); 

        // Making server call 
        HttpResponse response = httpclient.execute(httppost); 
        HttpEntity r_entity = response.getEntity(); 

        int statusCode = response.getStatusLine().getStatusCode(); 
        if (statusCode == 200) { 
         // Server response 
         responseString = EntityUtils.toString(r_entity); 
        } else { 
         responseString = "Error occurred! Http Status Code: " 
           + statusCode; 
        } 

       } catch (ClientProtocolException e) { 
        responseString = e.toString(); 
       } catch (IOException e) { 
        responseString = e.toString(); 
       } 
       responseString = responseString.replace("\"",""); 
       return responseString; 

      } 

      @Override 
      protected void onPostExecute(String result) { 
       super.onPostExecute(result); 
      } 

     } 
+0

现在你在onPostExecute()中获得一个字符串的结果然后最新的问题是什么? –

+0

我想要结果字符串,我打电话给asynctask @DonChakkappan –

+0

你的意思是你想execute()返回一个字符串? – lelloman

回答

0

试试我的代码如下。

public Result CallServer(String params) 
{ 
try 
{ 
    MainAynscTask task = new MainAynscTask(); 
    task.execute(params); 
    Result aResultM = task.get(); //Add this 
} 
catch(Exception ex) 
{ 
    ex.printStackTrace(); 
} 
return aResultM;//Need to get back the result 

}

+0

我会在哪里写这个? –

+0

这很难看,认真 – lelloman

+1

在我的代码中,MainAyncTask是我的AsyncTask。你可以在你调用AsyncTask的地方实现这个逻辑。 –

0

你几乎得到了它,你应该做的只有一步。正如我所看到的,您将返回doInBackground方法的结果(由于致电uploadFile)。现在,这个值被传递给在主线程上执行的onPostExecute方法。在其正文中,您应通知正在等待结果的组件,结果已达到。有很多方法可以做到这一点,但如果你不想使用第三方库,最简单的方法应该是在AsyncTask的构造函数中注入监听器,并在onPostExecute处调用它。例如,你可以声明如下界面:

public interface MyListener { 
    void onDataArrived(String data); 
} 

,注入一个实例在AsyncTask构造实现它:

public UploadFileToServer(String userInfoId, String url, MyListener listener){ 
    loginUserInfoId = userInfoId; 
    filePath = url; 
    mListener = listener; 
} 

现在,你可以简单地在onPostExecute使用它:

@Override 
protected void onPostExecute(String result) { 
    listener.onDataArrived(result); 
    super.onPostExecute(result); //actually `onPostExecute` in base class does nothing, so this line can be removed safely 
} 

如果您正在寻找更复杂的解决方案,您可以从阅读this文章开始。