0

http投稿を使用してサーバーにファイルをアップロードしています簡単な方法で仕事を完了できますが、読み込み中...ダイアログが表示されません...これを修正するにはどうすればよいですか...これが私のコードです

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();
}
4

5 に答える 5

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ファイルを作成しないでください。通常、作業しているクラスファイルの一番下に貼り付けます。

于 2012-04-25T12:46:49.230 に答える
0

まず、ProgressDialog.show()を2回呼び出しますが、これは不要です。そして、おそらくそれが表示されない理由の1つは、表示された直後に却下されるためです。たとえば、ファイルのアップロードが非常に高速であるか、失敗するか、別のスレッドで行われる場合、dismiss()の呼び出しが非常に速く呼び出されるため、ダイアログが表示されなくなります。

于 2012-04-25T12:46:03.637 に答える
0

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

痛みのないスレッディング

于 2012-04-25T12:40:22.853 に答える
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);
    }
}
于 2012-04-25T12:47:54.613 に答える
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();
        }
    }
}
于 2012-04-25T12:48:00.243 に答える