2012-04-25 77 views
0

我上传文件到我的服务器使用http发布我有一个简单的方法女巫获取工作完成,但加载...对话框永远不会显示我该如何解决这个...在这里是我的代码在上传文件时显示加载对话框android

public void send_data() throws IOException 
{ 
    HttpURLConnection connection = null; 
    DataOutputStream outputStream = null; 
    String lineEnd = "\r\n"; 
    String twoHyphens = "--"; 
    String boundary = "*****"; 

    ProgressDialog dialog = ProgressDialog.show(CaptureTestActivity.this, "", 
     "Loading. Please wait...", true); 
    dialog.show(); 

    String urlServer = "http://poi.gps.ro:80/postimg?lat=" + String.valueOf(mDraw.lat) + "&lon=" + String.valueOf(mDraw.lon)+"&comment=" + tmp; 
    Log.w("DHA", urlServer); 
    URL url = new URL(urlServer); 
    if (url != null) 
    { 
     Log.w("DHA", "Merge aici"); 
     connection = (HttpURLConnection) url.openConnection(); 
     if (connection != null) 
     { 
      Log.w("DHA", "Si aici mere!"); 
      connection.setDoInput(true); 
      connection.setDoOutput(true); 
      connection.setUseCaches(false); 
      connection.setRequestMethod("POST"); 
      connection.setRequestProperty("Host", "poi.gps.ro"); 
      connection.setRequestProperty("Connection", "Keep-Alive"); 
      connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=*****"); 
      outputStream = new DataOutputStream(connection.getOutputStream()); 
      outputStream.writeBytes(twoHyphens + boundary + lineEnd); 
      outputStream.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + "PICT0000" +"\"" + lineEnd); 
      outputStream.writeBytes(lineEnd); 
      outputStream.write(btarr.toByteArray()); 
      outputStream.writeBytes(lineEnd); 
      outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 
      Log.w("DHA", "Incep trimiterea pozei!"); 
      outputStream.flush(); 
      outputStream.close(); 
      int serverResponseCode = connection.getResponseCode(); 
      String conn = connection.getResponseMessage(); 
     // InputStream in = connection.getInputStream(); 
     // StringWriter writer = new StringWriter(); 

      Log.w("DHA", conn); 
      Log.w("DHA", "Serverul a raspuns cu " + String.valueOf(serverResponseCode)); 
      if (serverResponseCode == 200) 
      { 
       AlertDialog alertDialog; 
       alertDialog = new AlertDialog.Builder(this).create(); 
       alertDialog.setTitle("Super :)"); 
       alertDialog.setMessage("Poza a fost trimisa cu success."); 
       alertDialog.setButton("Ok", new DialogInterface.OnClickListener() { 

         public void onClick(DialogInterface dialog, int id) { 

         finish(); 

        } }); 
       alertDialog.show(); 

      } 


} 
    } 
    dialog.dismiss(); 
} 
+0

要显示“加载”对话框,您必须在不同的线程上执行实际的文件传输。使用AsyncTask或Thread或Runnable进行此操作。您不应该在UI线程上有任何长时间运行的进程。 – 2012-04-25 12:40:21

回答

1

大卫说,你需要一个AsynTask,最实用的选择。你可以用 Void,Void,Void部分做一些巧妙的事情,但除非你想看看文档,这应该工作得很好。

public class MyActivity extends Activity { 

.... 

    private final class AsyncSender extends AsyncTask<Void, Void, Void> { 

     ProgressDialog pd; 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

      pd = new ProgressDialog(MyActivity.this); 
      pd.setTitle("Sending Data"); 
      pd.setMessage("Please wait, data is sending"); 
      pd.setCancelable(false); 
      pd.setIndeterminate(true); 
      pd.show(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      send_data(); // You probably have to try/catch this 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      pd.dismiss(); 
     } 
    } 
} 

然后当你怎么称呼它,最彻底的方法是调用

new AsyncSender().execute(); 

而且,我应该提到,这应该是一个内部类,意义不创建一个单独的Java文件它。一般来说,我只是在类文件,我在工作的底部贴他们。

+0

我不能打电话给MyActivity.this – opc0de 2012-04-25 13:30:53

+0

嘿opc0de,我应该更清楚。将“MyActivity.this”更改为您所在的java文件的名称。因此,如果您在“MySendingActivity.java”中工作,那么它将是“MySendingActivity.this”。这只是获取上下文的一种聪明方式。 – 2012-04-26 07:52:23

+0

尝试过仍然无法使用! – opc0de 2012-04-26 07:58:43

0

您使用上传代码阻止UI。您需要使用AsyncTask/thread/service。

Painless Threading

0

首先调用ProgressDialog.show()两次这是不必要的。也许它没有显示的一个原因是因为在它被显示之后它被解雇了。 例如,如果您的文件上传非常快或失败,或者在另一个线程中完成,那么调用dismiss()将会很快被调用,您将无法看到对话。

0

当你想要做背景的任何任务,并希望在屏幕上显示的另一件事,你应该使用的AsyncTask ...

这是使用的AsyncTask现在ü可以更新登录的一个例子...

public class mytask extends AsyncTask<Object, Object, Object> { 

    String METHOD_NAME = "Login"; 
    String NAMESPACE = "http://tempuri.org/"; 
    SoapObject request; 
    String SOAP_ACTION = "http://tempuri.org/Login"; 
    @Override 
    protected Object doInBackground(Object... params) { 
     Log.d(TAG, "doInBackground(Void... params"); 
     Object flag = null; 
     try { 
      flag = TAGS.sendToServerAndGetResponse(request, SOAP_ACTION); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (XmlPullParserException e) { 
      e.printStackTrace(); 
     } 
     return flag; 
    } 

    @Override 
    protected void onPostExecute(Object result) { 
     if (result.toString().equalsIgnoreCase("true")) { 

      mIntent = new Intent(); 
      mIntent.setClass(PresenTABActivity.this, 
        presentation_list.class); 
      startActivity(mIntent); 
      finish(); 
     } else { 
      Toast.makeText(getApplicationContext(), 
        "Please Enter Valid Username or Password", 
        Toast.LENGTH_SHORT).show(); 
      edtPass.setVisibility(View.VISIBLE); 
      edtUname.setVisibility(View.VISIBLE); 
      chk_remeber_me.setVisibility(View.VISIBLE); 
      btnSubmit.setVisibility(View.VISIBLE); 
      mProgressBar.setVisibility(View.INVISIBLE); 
      loading.setVisibility(View.INVISIBLE); 
     } 
    } 

    @Override 
    protected void onPreExecute() { 
     Log.d(TAG, "onPreExecute()"); 
     request = new SoapObject(NAMESPACE, METHOD_NAME); 
     request.addProperty("Username", edtUname.getText().toString() 
       .trim()); 
     request.addProperty("password", edtPass.getText().toString().trim()); 

     mProgressBar = (ProgressBar) findViewById(R.id.progress_login); 
     loading = (TextView) findViewById(R.id.tv_loading); 
     loading.setVisibility(View.VISIBLE); 
     mProgressBar.setVisibility(View.VISIBLE); 

     edtPass.setVisibility(View.INVISIBLE); 
     edtUname.setVisibility(View.INVISIBLE); 

     chk_remeber_me.setVisibility(View.INVISIBLE); 
    } 
} 
0

查看本页面:http://www.vogella.com/articles/AndroidPerformance/article.html

private class UploadingTask extends AsyncTask<Void, Void, Void> { 

private ProgressDialog mProgressDialog; 

    @Override 
    protected void onPreExecute() { 
     mProgressDialog = ProgressDialog.show(this, title, message, true); 
    } 

    @Override 
    protected Void doInBackground(final Void... params) { 
     // Do your work .. uploading 
     return null; 
    } 

    @Override 
    protected void onPostExecute(final Void result) { 
     if (mProgressDialog != null) { 
     mProgressDialog.dismiss(); 
     } 
    } 
}