0

私は Android 用のアプリを作成するのに非常に慣れていないので、これが他の人にとって時間の無駄と見なされないことを願っています。また、私のコードがうまくまとめられていないと確信しているので、笑わないようにしてください。

アプリからリモート PHP フォームに値を送信しようとしています。私が持っているものは、フォームに情報を送信する際にうまく機能しているように見えますが、アプリがインターネットに接続されておらず、何も送信できない場合にエラーを処理する方法がわかりません。トーストまたはエラー メッセージを表示して、メッセージが送信されなかったこととその理由をユーザーに通知する方法がわかりません。

また、送信された確認またはエラーが表示されたときに、すべてを約 3 ~ 4 秒間一時停止する方法もわかりません。私は過去 4 時間、これらのことと格闘し、stackoverflow や他のいくつかのフォーラムをブラウジングして、「ああ、ああ!」というコード例を見つけようとしました。瞬間、しかしそのような運はありません。

誰かが私を助けてくれたり、私がこれで間違っていることを指摘してくれることを願っています. ありがとう!

私のコード全体は次のとおりです。

package net.testapp.commenter;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.Toast;

public class suptest extends Activity implements OnClickListener{

private EditText name, email, phone, comment;
private Button postbutton;
private ProgressBar pbfirst;
private RelativeLayout pbdark, pbsent;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.suptest);

    // stuff in the layout
    name=(EditText)findViewById(R.id.editText1);
    email=(EditText)findViewById(R.id.editText2);
    phone=(EditText)findViewById(R.id.editText3);
    comment=(EditText)findViewById(R.id.editText4);
    postbutton=(Button)findViewById(R.id.sendButton);
    pbfirst=(ProgressBar)findViewById(R.id.progressBar1);
    pbdark=(RelativeLayout)findViewById(R.id.pbdark);
    pbsent=(RelativeLayout)findViewById(R.id.pbsent);

    // hide some stuff up front
    pbfirst.setVisibility(View.GONE);
    pbdark.setVisibility(View.GONE);
    pbsent.setVisibility(View.GONE);

    // post button listener thingy
    postbutton.setOnClickListener(this);

// Go back button
Button goback = (Button) findViewById(R.id.goback);
goback.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view) {
        Intent intent = new Intent();
        setResult(RESULT_OK, intent);
        finish();
    }
});
};

// clicking the send button
public void onClick(View v) {
        if(email.getText().toString().length()<1){
        // TODO LEARN HOW TO APPLY THIS TO OTHER FIELDS AS WELL

        // Remind user to fill in text fields
        Toast.makeText(this, "Please fill in all fields.", Toast.LENGTH_LONG).show();

        }else{
            //show my progress bar and dark fullscreen layout for "Sending" text to overlay
            pbdark.setVisibility(View.VISIBLE);
            pbfirst.setVisibility(View.VISIBLE);
            new MyAsyncTask().execute();        
        }
} 

// Where all the http post magic happens
private class MyAsyncTask extends AsyncTask<String, Integer, Double>{

    @Override
    protected Double doInBackground(String... params) {
        // TODO Auto-generated method stub
        postData(); 
        return null;
    }

    protected void onPostExecute(Double result){

        //make progress bar and dark background for "Sending" test vanish
        pbfirst.setVisibility(View.GONE);
        pbdark.setVisibility(View.GONE);

        //make sent confirmation appear
        pbsent.setVisibility(View.VISIBLE);

        // TODO FIGURE OUT HOW TO PAUSE ON SENT CONFIRMATION MESSAGE JUST LONG ENOUGH TO READ IT BEFORE FINISH()
        finish();

    }

    protected void onProgressUpdate(Integer... progress){
        pbfirst.setProgress(progress[0]);
    }

    public void postData() {

        // Strings for the layout stuff
        String  namer = name.getText().toString();
        String  emailer = email.getText().toString();
        String  phoner = phone.getText().toString();
        String  commenter = comment.getText().toString();

        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://www.mysite.net/commentform.php");

        try {

            // talk to the PHP script
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4);
            nameValuePairs.add(new BasicNameValuePair("name", namer));
            nameValuePairs.add(new BasicNameValuePair("email", emailer));
            nameValuePairs.add(new BasicNameValuePair("number", phoner));
            nameValuePairs.add(new BasicNameValuePair("comments", commenter));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            // execute the http post
            @SuppressWarnings("unused")
            HttpResponse response = httpclient.execute(httppost);

        } catch (ClientProtocolException e) {

        } catch (IOException e) {

        }
    }

}

}
4

2 に答える 2

0

さて、クラッシュした理由を理解できたと思います。どうやら、別のスレッドである AsyncTask は UI を操作できないため、エラー メッセージなどを表示するためにこれをキャッチに入れる必要がありました...

runOnUiThread(new Runnable() {
  public void run() {
    //And now for my one line of code to display the error message
     pber2.setVisibility(View.VISIBLE);
     }
});

これが少なくとも将来誰かに役立つことを願っています!

于 2013-09-17T17:49:25.313 に答える
0

これを行うには、ClientProtocolException と IOException の catch ブロック内にコードを追加します。以下のようなコードを使用してダイアログを表示するか、Android トーストを使用することができます...

    public void showDialog(final Activity activity, final String title, final String message) {

    activity.runOnUiThread(new Runnable() {
        public void run() {
            // 1. Instantiate an AlertDialog.Builder with its constructor
            AlertDialog.Builder builder = new AlertDialog.Builder(activity);

            // 2. Chain together various setter methods to set the dialog
            // characteristics
            builder.setMessage(message).setTitle(title);

            // 3. Get the AlertDialog from create()
            AlertDialog dialog = builder.create();

            dialog.show();
        }
    });
}
于 2013-09-16T02:18:12.857 に答える