Attempting to follow basic How to connect Android

2019-07-25 07:58发布

Ok - so I'm using the following tutorial: "How to connect Android with PHP, MySQL"

However almost everyone who attempts the tutorial (judging from the comments) is having force close issues due to the application only being designed to run on API level 8 or earlier.

Several users have developed a fix for this involving adding the following lines of code in EditProductActivity.java file

// this part only to identify where to put the working code

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_product);

// NB * insert the line below in import section of EditProductActivity.java // import android.os.StrictMode;

// Now the code thaat avoid the NetworkOnMainThreadException error

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);

However I'm getting messages in my logcat stating StrictMode cannot be resolved and StrictMode cannot be resolved to a type. I've done a bit of research into this and StrictMode is included in API level 8 and above. Taking that into consideration I've raised my API levels in AndroidManifest.xml to:

 <uses-sdk android:minSdkVersion="9"
          android:targetSdkVersion="9"/>

Then cleaned my project - however I still get StrictMode cannot be resolved to a type errors.

LOGCAT:

    03-17 14:06:57.924: D/AndroidRuntime(18472): Shutting down VM
    03-17 14:06:57.924: W/dalvikvm(18472): threadid=1: thread exiting with uncaught exception (group=0x41604930)
    03-17 14:06:57.924: E/AndroidRuntime(18472): FATAL EXCEPTION: main
    03-17 14:06:57.924: E/AndroidRuntime(18472): java.lang.Error: Unresolved compilation problems: 
    03-17 14:06:57.924: E/AndroidRuntime(18472):    The import android.os.StrictMode cannot be resolved
   03-17 14:06:57.924: E/AndroidRuntime(18472):     StrictMode cannot be resolved to a type
    03-17 14:06:57.924: E/AndroidRuntime(18472):    StrictMode cannot be resolved to a type
    03-17 14:06:57.924: E/AndroidRuntime(18472):    StrictMode cannot be resolved
    03-17 14:06:57.924: E/AndroidRuntime(18472):    at com.example.androidhive.NewProductActivity.<init>(NewProductActivity.java:10)
    03-17 14:06:57.924: E/AndroidRuntime(18472):    at java.lang.Class.newInstanceImpl(Native Method)
    03-17 14:06:57.924: E/AndroidRuntime(18472):    at java.lang.Class.newInstance(Class.java:1319)
    03-17 14:06:57.924: E/AndroidRuntime(18472):    at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
    03-17 14:06:57.924: E/AndroidRuntime(18472):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
    03-17 14:06:57.924: E/AndroidRuntime(18472):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
    03-17 14:06:57.924: E/AndroidRuntime(18472):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
    03-17 14:06:57.924: E/AndroidRuntime(18472):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
    03-17 14:06:57.924: E/AndroidRuntime(18472):    at android.os.Handler.dispatchMessage(Handler.java:99)
    03-17 14:06:57.924: E/AndroidRuntime(18472):    at android.os.Looper.loop(Looper.java:137)
    03-17 14:06:57.924: E/AndroidRuntime(18472):    at android.app.ActivityThread.main(ActivityThread.java:5039)
    03-17 14:06:57.924: E/AndroidRuntime(18472):    at java.lang.reflect.Method.invokeNative(Native Method)
    03-17 14:06:57.924: E/AndroidRuntime(18472):    at java.lang.reflect.Method.invoke(Method.java:511)
    03-17 14:06:57.924: E/AndroidRuntime(18472):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    03-17 14:06:57.924: E/AndroidRuntime(18472):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    03-17 14:06:57.924: E/AndroidRuntime(18472):    at dalvik.system.NativeStart.main(Native Method)

JAVA:

import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.os.StrictMode;

 public class EditProductActivity extends Activity {

EditText txtName;
EditText txtPrice;
EditText txtDesc;
EditText txtCreatedAt;
Button btnSave;
Button btnDelete;

String pid;

// Progress Dialog
private ProgressDialog pDialog;

// JSON parser class
JSONParser jsonParser = new JSONParser();

// single product url
private static final String url_product_detials =  "http://linkingmanager.zxq.net/get_product_details.php";

// url to update product
private static final String url_update_product = "http://linkingmanager.zxq.net/update_product.php";

// url to delete product
private static final String url_delete_product = "http://linkingmanager.zxq.net/delete_product.php";

// JSON Node names
private static final String TAG_SUCCESS = "success";
private static final String TAG_PRODUCT = "product";
private static final String TAG_PID = "pid";
private static final String TAG_NAME = "name";
private static final String TAG_PRICE = "price";
private static final String TAG_DESCRIPTION = "description";

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

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
    .permitAll().build();
    StrictMode.setThreadPolicy(policy);

    // save button
    btnSave = (Button) findViewById(R.id.btnSave);
    btnDelete = (Button) findViewById(R.id.btnDelete);

    // getting product details from intent
    Intent i = getIntent();

    // getting product id (pid) from intent
    pid = i.getStringExtra(TAG_PID);

    // Getting complete product details in background thread
    new GetProductDetails().execute();

    // save button click event
    btnSave.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // starting background task to update product
            new SaveProductDetails().execute();
        }
    });

    // Delete button click event
    btnDelete.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // deleting product in background thread
            new DeleteProduct().execute();
        }
    });

}

/**
 * Background Async Task to Get complete product details
 * */
class GetProductDetails extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(EditProductActivity.this);
        pDialog.setMessage("Loading product details. Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    /**
     * Getting product details in background thread
     * */
    protected String doInBackground(String... params) {

        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {
                // Check for success tag
                int success;
                try {
                    // Building Parameters
                    List<NameValuePair> params = new  ArrayList<NameValuePair>();
                    params.add(new BasicNameValuePair("pid", pid));

                    // getting product details by making HTTP request
                    // Note that product details url will use GET request
                    JSONObject json = jsonParser.makeHttpRequest(
                            url_product_detials, "GET", params);

                    // check your log for json response
                    Log.d("Single Product Details", json.toString());

                    // json success tag
                    success = json.getInt(TAG_SUCCESS);
                    if (success == 1) {
                        // successfully received product details
                        JSONArray productObj = json
                                 .getJSONArray(TAG_PRODUCT); // JSON Array

                        // get first product object from   JSON Array
                        JSONObject product = productObj.getJSONObject(0);

                        // product with this pid found
                        // Edit Text
                        txtName = (EditText) findViewById(R.id.inputName);
                        txtPrice = (EditText) findViewById(R.id.inputPrice);
                        txtDesc = (EditText)  findViewById(R.id.inputDesc);

                        // display product data in EditText
                          txtName.setText(product.getString(TAG_NAME));
                        txtPrice.setText(product.getString(TAG_PRICE));
                        txtDesc.setText(product.getString(TAG_DESCRIPTION));

                    }else{
                        // product with pid not found
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });

        return null;
    }


    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog once got all details
        pDialog.dismiss();
    }
}

/**
 * Background Async Task to  Save product Details
 * */
class SaveProductDetails extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(EditProductActivity.this);
        pDialog.setMessage("Saving product ...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    /**
     * Saving product
     * */
    protected String doInBackground(String... args) {

        // getting updated data from EditTexts
        String name = txtName.getText().toString();
        String price = txtPrice.getText().toString();
        String description = txtDesc.getText().toString();

        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair(TAG_PID, pid));
        params.add(new BasicNameValuePair(TAG_NAME, name));
        params.add(new BasicNameValuePair(TAG_PRICE, price));
        params.add(new BasicNameValuePair(TAG_DESCRIPTION, description));

        // sending modified data through http request
        // Notice that update product url accepts POST method
        JSONObject json = jsonParser.makeHttpRequest(url_update_product,
                "POST", params);

        // check json success tag
        try {
            int success = json.getInt(TAG_SUCCESS);

            if (success == 1) {
                // successfully updated
                Intent i = getIntent();
                // send result code 100 to notify about product update
                setResult(100, i);
                finish();
            } else {
                // failed to update product
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }


    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog once product uupdated
        pDialog.dismiss();
    }
}

/*****************************************************************
 * Background Async Task to Delete Product
 * */
class DeleteProduct extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(EditProductActivity.this);
        pDialog.setMessage("Deleting Product...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    /**
     * Deleting product
     * */
    protected String doInBackground(String... args) {

        // Check for success tag
        int success;
        try {
            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>    (); 
            params.add(new BasicNameValuePair("pid", pid));

            // getting product details by making HTTP request
            JSONObject json = jsonParser.makeHttpRequest(
                    url_delete_product, "POST", params);

            // check your log for json response
            Log.d("Delete Product", json.toString());

            // json success tag
            success = json.getInt(TAG_SUCCESS);
            if (success == 1) {
                // product successfully deleted
                // notify previous activity by sending code 100
                Intent i = getIntent();
                // send result code 100 to notify about product deletion
                setResult(100, i);
                finish();
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog once product deleted
        pDialog.dismiss();

    }

}
}

2条回答
甜甜的少女心
2楼-- · 2019-07-25 08:35
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);

Since you are using AsyncTask there is no need to setting ThreadPolicy.And don't forget that StrictMode is available starting with 2.3 version.

Update:

Your app is not designated very well. Look at this

protected String doInBackground(String... params) {

        runOnUiThread(new Runnable() { 
           ...
           txtName = (EditText) findViewById(R.id.inputName);
           txtPrice = (EditText) findViewById(R.id.inputPrice);
           txtDesc = (EditText)  findViewById(R.id.inputDesc);

           // display product data in EditText
           txtName.setText(product.getString(TAG_NAME));
           txtPrice.setText(product.getString(TAG_PRICE));
           txtDesc.setText(product.getString(TAG_DESCRIPTION));
           ...
        }
}

Why you're doing that? doInBackground() is directly designed for performing background operations also already runs on background Thread and you shouldn't perform UI update from it. You shouldn't mix it.

If you want to update UI, AsyncTask offers proper methods for achieve it:

  • onPreExecute()
  • onProgressUpdate()
  • onPostExecute()

Hence if you want to update your UI with some information about progress of background task call publishProgress(<data>) method that automatic invokes onProgressUpdate() method and from its update UI.

In your case you are performing initialisation of UI elements in doInBackground() method that you shouldn't.

I suggest you to make this:

  1. Initialise your widgets in onCreate() method.
  2. When you want to update them with data retrieved from doInBackground() method, call publishProgress() that invoke onProgressUpdate() method and here perform updating

Here is example:

@Override
protected void onProgressUpdate(String... params) {
   txtName.setText(<value>);
   ...
}

Based on things mentioned above i guess that you need to read AsyncTask tutorial:

查看更多
祖国的老花朵
3楼-- · 2019-07-25 08:40

Just make sure both your server and the android device is connected to the same wifi connection,make changes in the ip address as your server address for eg: change it to 192.168.1.102(whatever is shown on your server

The code works well and good i have tried it

查看更多
登录 后发表回答