0

タイトルがうまく構成されていない場合は申し訳ありません。基本的にこれが私の問題です。私の Android プロジェクトは REST クライアントです。webservice プロジェクトには、基本的に個人のプロファイル (名、姓など) を作成するいくつかのデータが含まれています。私の Android クライアントには、テキスト フィールドとボタンがあるアクティビティがあります。Main アクティビティのテキスト フィールドは、ユーザーがアカウント番号 (id=enter_acct) を入力する場所です。この番号は、詳細が webservice プロジェクトにある特定の人物を指します。MainActivity Java ファイルで、テキスト フィールドを含む新しいアクティビティを開くようにボタンに指示します。つまり、メイン アクティビティには、GET 要求を実行するためのすべてのコードが含まれています。2 番目のアクティビティは、テキスト フィールドを含む単なるレイアウトです。これが私のメインレイアウトファイルコードです:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  ......
/>

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true" />

<EditText
    android:id="@+id/enter_acct"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/textView1"
    android:layout_alignParentLeft="true"
    android:layout_marginBottom="20dp"
    android:layout_marginLeft="34dp"
    android:ems="10"
    android:hint="@string/acct" />

<Button
    android:id="@+id/search_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/textView1"
    android:layout_toRightOf="@+id/textView1"
    android:text="@string/searchText"
    android:onClick="retrievePersonData"
     />

次に示すのは、メソッド retrievePersonData を含む Main Activty Java ファイルのコードです。

public class MainActivity extends Activity {
private static final String SERVICE_URL = "http://serverIP";
private static final String TAG = "MainActivity";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    try {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        Button btnOpenNewActivity = (Button) findViewById(R.id.search_button);
        btnOpenNewActivity .setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

        Intent myIntent = new Intent(MainActivity.this,PersonModel.class);

        MainActivity.this.startActivity(myIntent);

        }

        });
        }
        catch (Exception e)
        {

        }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}



public void handleResponse(String response) {
    EditText edFirstName = (EditText) findViewById(R.id.firstName);
    EditText edLastName = (EditText) findViewById(R.id.lastName);
    EditText edEmail = (EditText) findViewById(R.id.email);
    EditText edAddress = (EditText) findViewById(R.id.address);

    edFirstName.setText("");
    edLastName.setText("");
    edEmail.setText("");
    edAddress.setText("");

    try {
        JSONObject jso = new JSONObject(response);

        String firstName = jso.getString("firstName");
        String lastName = jso.getString("lastName");
        String email = jso.getString("email");
        String address = jso.getString("address");

        edFirstName.setText(firstName);
        edLastName.setText(lastName);
        edEmail.setText(email);
        edAddress.setText(address);

    } catch (Exception e) {
        Log.e(TAG, e.getLocalizedMessage(), e);

    }
}

public void hideKeyboard() {
    InputMethodManager inputManager = (InputMethodManager) MainActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(MainActivity.this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

public class WebServiceTask extends AsyncTask<String, Integer, String> {
    public static final int GET_TASK = 1;
    public static final int POST_TASK = 2;

    private static final String TAG = "WebServiceTask";

    // connection timeout in milliseconds.. waiting for connect
    private static final int CONN_TIMEOUT = 3000;

    // socket timeout, in milisecs (waiting for data)...
    private static final int SOCKET_TIMEOUT = 5000;

    private int taskType = GET_TASK;
    private Context mContext = null;
    private String processMessage = "Processing...";

    private ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();

    private ProgressDialog pDlg = null;

    public WebServiceTask(int taskType, Context mContext, String processMessage) {
        this.taskType = taskType;
        this.mContext = mContext;
        this.processMessage = processMessage;

    }

    public void addNameValuePair(String name, String value) {
        params.add(new BasicNameValuePair(name, value));
    }

    private void showProgressDialog() {
        pDlg = new ProgressDialog(mContext);
        pDlg.setMessage(processMessage);
        pDlg.setProgressDrawable(mContext.getWallpaper());
        pDlg.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
        pDlg.setCancelable(false);
        pDlg.show();
    }

    @Override
    protected void onPreExecute() {

        hideKeyboard();
        showProgressDialog();

    }

    protected String doInBackground(String... urls) {
        String url = urls[0];
        String result = "";

        HttpResponse response = doResponse(url);

        if(response == null) {
            return result;
        } else {
            try {

                result = inputStreamToString(response.getEntity().getContent());

            } catch (IllegalStateException e) {
                Log.e(TAG, e.getLocalizedMessage(), e);

            } catch (IOException e) {
                Log.e(TAG, e.getLocalizedMessage(), e);
            }
        }

        return result;


    }

    @Override
    public void onPostExecute(String response) {

        handleResponse(response);
        pDlg.dismiss();

    }

    public HttpParams getHttpParams() {

        HttpParams httpa = new BasicHttpParams();

        HttpConnectionParams.setConnectionTimeout(httpa, CONN_TIMEOUT);
        HttpConnectionParams.setSoTimeout(httpa, SOCKET_TIMEOUT);

        return httpa;
    }

    public HttpResponse doResponse(String url) {

    HttpClient hClient = new DefaultHttpClient(getHttpParams());

    HttpResponse response = null;

    try {
        switch (taskType) {

        case POST_TASK:
            HttpPost httppost = new HttpPost(url);
            httppost.setEntity(new UrlEncodedFormEntity(params));
            response = hClient.execute(httppost);
            break;
        case GET_TASK:
            HttpGet httpget = new HttpGet(url);
            response = hClient.execute(httpget);
            break;
        }

    } catch (IOException e) {
        Log.e(TAG, e.getLocalizedMessage(), e);
    }
    return response;
    }

    private String inputStreamToString(InputStream is) {

        String line = "";
        StringBuilder total = new StringBuilder();

        BufferedReader bf = new BufferedReader(new InputStreamReader(is));

        try {
            while ((line = bf.readLine()) != null) {
                total.append(line);
        }
    } catch (IOException e) {
        Log.e(TAG, e.getLocalizedMessage(), e);
    }
    return total.toString();
    }   


}

ボタンをクリックすると、次の 2 つのことが行われます。

  1. テキスト フィールドで新しいアクティビティを開きます。

  2. これらのテキスト フィールドに、Web サービス プロジェクトからの情報を入力します。

これは、テキスト フィールドとボタンを含むアクティビティが 1 つある場合に問題なく機能します (つまり、ボタンをクリックすると、Web サービスと通信し、フィールドに情報が入力されます)。この場合、ボタンをクリックすると、新しいアクティビティが開きますが、テキスト フィールドは入力されません...何もしません。

誰かが助けてくれませんか。もっと明確にする必要がある場合は、そうします。どんな助けでも大歓迎です。

4

1 に答える 1

1

UI コードで HTTP リクエストを実行しようとしているため、Force Close が発生しました。UI スレッドがブロックされないように、サービスまたは AysncTask またはスレッドで実行してみてください。

この例を参照してください:

ボタンのクリックで複数のアクションを実行し、上記の手法で GET メソッドを起動して、Activity を開始できます。

public class PersonModel extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        EditText firstNameTxt= (EditText) findViewById(R.id.editText1);
        firstNameTxt.setText("set your value");
    }
}

PersonModel の OnCreate メソッドで SetText を使用して、EditText の値を設定してみてください。

ありがとう

于 2013-01-11T22:45:39.707 に答える