简体   繁体   中英

Android php+mysql+json error implementing AsyncTask

Im new to Android and I need a little help. I have a class witch values from one table located on remote mysql and its working fine on 2.3 but on 4.x Im getting errors when I start it. I have read somewhere its because I`m not using AsyncTask. I tried to implement it on existing working code but there is one error, so please help because I tried everything to get this to work but no success.

Here is the existing code that works on 2.3

package com.stole.fetchtest;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
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.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.ListActivity;
import android.net.ParseException;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.Toast;

public class FetchData extends ListActivity {

    @SuppressWarnings("unchecked")
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        String result = null;
        InputStream is = null;
        StringBuilder sb = null;
        ArrayList<?> nameValuePairs = new ArrayList<Object>();
        List<String> r = new ArrayList<String>();

        try {


            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(
                    "http://www.url.com/fetch.php");
            httppost.setEntity(new UrlEncodedFormEntity(
                    (List<? extends NameValuePair>) nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();
        } catch (Exception e) {
            Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG)
                    .show();
        }


        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "UTF-8"));

            sb = new StringBuilder();

            String line = null;

            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }

            is.close();

            result = sb.toString();
        } catch (Exception e) {
            Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG)
                    .show();
        }

        try {
            JSONArray jArray = new JSONArray(result);
            JSONObject json_data = null;
            for (int i = 0; i < jArray.length(); i++) {
                json_data = jArray.getJSONObject(i);
                r.add(json_data.getString("names"));
            }
            setListAdapter(new ArrayAdapter<String>(this, R.layout.names_row, r));
        } catch (JSONException e1) {
            Toast.makeText(getBaseContext(), e1.toString(), Toast.LENGTH_LONG)
                    .show();
        } catch (ParseException e1) {
            Toast.makeText(getBaseContext(), e1.toString(), Toast.LENGTH_LONG)
                    .show();
        }

    }}

And then I tried to add AsyncTask, according to some tutorials found online, and it`s looking like this:

package com.stole.fetchtest;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
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.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.ListActivity;
import android.net.ParseException;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.Toast;

public class FetchData extends ListActivity {

    String result = null;
    InputStream is = null;
    StringBuilder sb = null;
    ArrayList<?> nameValuePairs = new ArrayList<Object>();
    List<String> r = new ArrayList<String>();

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        new task().execute();
    }

    public class task extends AsyncTask<String, String, Void> {

        @SuppressWarnings("unchecked")
        @Override
        protected Void doInBackground(String... params) {

            try {

                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://www.url.com/fetch.php");
                httppost.setEntity(new UrlEncodedFormEntity(
                        (List<? extends NameValuePair>) nameValuePairs));
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();
            } catch (Exception e) {
                Toast.makeText(getBaseContext(), e.toString(),
                        Toast.LENGTH_LONG).show();
            }

            try {
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(is, "iso-8859-1"));

                sb = new StringBuilder();

                String line = null;

                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }

                is.close();

                result = sb.toString();
            } catch (Exception e) {
                Toast.makeText(getBaseContext(), e.toString(),
                        Toast.LENGTH_LONG).show();
            }

            return null;
        }

        protected void onPostExecute(Void v) {

            try {
                JSONArray jArray = new JSONArray(result);
                JSONObject json_data = null;
                for (int i = 0; i < jArray.length(); i++) {
                    json_data = jArray.getJSONObject(i);
                    r.add(json_data.getString("naziv"));
                }
                setListAdapter(new ArrayAdapter(this, R.layout.names_row, r));
            } catch (JSONException e1) {
                Toast.makeText(getBaseContext(), e1.toString(),
                        Toast.LENGTH_LONG).show();
            } catch (ParseException e1) {
                Toast.makeText(getBaseContext(), e1.toString(),
                        Toast.LENGTH_LONG).show();
            }

        }

    }

}

The error I`m getting is at

setListAdapter(new ArrayAdapter(this, R.layout.names_row, r));

and it says " The constructor ArrayAdapter(FetchData.task, int, List) is undefined " Thanks!

它应该使用活动上下文而不是任务上下文。

setListAdapter(new ArrayAdapter(FetchData.this, R.layout.names_row, r));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM