2012-04-25 47 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(); 
     } 
    } 
}