2012-04-25 9 views
0

http postを使用してサーバーにファイルをアップロードしています。単純なメソッドを持っていますが、ジョブは完了しますが、読み込み中のダイアログは表示されません。私のコードですファイルをアップロード中にダイアログを読み込むダイアログを表示する

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スレッドで長時間実行されるプロセスはありません。 –

答えて

1

Davidは言ったように、最も実用的なオプションである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

+0

ちょっとopc0de、私はより明確にされている必要があります。 "MyActivity.this"を現在のJavaファイルの名前に変更します。したがって、 "MySendingActivity.java"で作業している場合は、 "MySendingActivity.this"になります。それは文脈を得るための単なる巧妙な方法です。 –

+0

まだ動作しませんでした! – opc0de

0

あなたはアップロードコードでUIをブロックしています。 AsyncTask/thread /サービスを使用する必要があります。

Painless Threading

0

まず第一に、あなたは不要倍であるProgressDialog.show()を呼び出します。そして、それが表示されない理由の1つは、表示された直後に解雇されるためです。 たとえば、ファイルのアップロードが本当に高速であるか、失敗した場合や、別のスレッドで完了した場合は、dismiss()の呼び出しがすぐに呼び出され、ダイアログが表示されなくなります。

0

をあなたは...

AsyncTaskを使用する必要がありますバックグラウンドで任意のタスクを実行したいと画面上に別のものを表示したいとき

これは...今uはそれを更新することができます

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

チェックこのページAsyncTaskを使ってログインする例を示します。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(); 
     } 
    } 
} 
関連する問題