Как я схватываю JSon с AsynTask в android?

Это моя функция:

public class JSONRequest extends AsyncTask <String, Void, JSONObject>{

private JSONCallback activity;

public JSONRequest(JSONCallback activity){
    this.activity = activity;
}

@Override
protected JSONObject doInBackground(String... params) {
    JSONObject result = null;

}

protected void onPostExecute(JSONObject jsonObject) {
    super.onPostExecute(jsonObject);
    activity.callBack(jsonObject);
}

Чего мне не хватает?

5
задан 19.10.2016, 19:56
10 ответов

Ты нуждаешься в том, чтобы прочитать файл и обратить это в JSON .

Пример:

JSONObject json;
URL url = new URL("url");
HttpURLConnection conexion = (HttpURLConnection) url.openConnection();
conexion.connect();

InputStream is = conexion.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));

StringBuilder sb = new StringBuilder();
String linea = "";

while ((linea = br.readLine()) != null){
      sb.append(linea);
}
json = new JSONObject(sb.toString());

Восток cГіdigo идет внутри нее funciГіn doInBackground, и Гєnico, которую ты должен возвращать, - JSON .

3
ответ дан 24.11.2019, 13:03

Хуан Пабло, проверяя твой код, внутри doInBackground() тебя Asynctask ты получаешь String (конечно .json), от которого будет получен один JSONObject который будет послан в onPostExecute():

public class JSONRequest extends AsyncTask <String, Void, JSONObject>{

private JSONCallback activity;

public JSONRequest(JSONCallback activity){
    this.activity = activity;
}

@Override
protected JSONObject doInBackground(String... params) {
    //Recibe un String en formato .json y obtiene un JSONObject.
    JSONObject result = null;

}

protected void onPostExecute(JSONObject jsonObject) {
    //Recibe el JSONObject obtenido en doInBackground().
    super.onPostExecute(jsonObject);
    activity.callBack(jsonObject);
}

На основании предыдущего мы сфокусируемся в методе doInBackground(), здесь вопрос каков - объект JSON, который ты хочешь получить, заранее нуждаешься в том, чтобы узнать имя, чтобы это получать, например давайте предполагать твой JSONObject он называется "datos":

@Override
protected JSONObject doInBackground(String... params) {
    //Recibe un String en formato .json y obtiene un JSONObject.
    JSONObject data = params[0].getJSONObject("datos");
    //JSONObject result = null;    
}

Я считаю твой немного широкий вопрос, добавляю пример, в котором ты нуждаешься, регулярно параметр, чтобы инициализировать твой Asynctask, должен быть url файла Json и начиная с этого он получается уже его было один JSONObject или один JSONArray, это пример:

    class JSONParser extends AsyncTask<String, Void, JSONObject>{

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    String url;
    List<NameValuePair> params;

    public JSONParser(String url, List<NameValuePair> params) {
        this.url = url;
        this.params = params;
    }

    @Override
    protected JSONObject doInBackground(String... args) {
        // Making HTTP request
            try {
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();


            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }


            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        is, "iso-8859-1"), 8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                is.close();
                json = sb.toString();
                Log.e("JSON", json);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
            }

            // Parsea el string a JSONobject.
            try {
                jObj = new JSONObject(json);            
            } catch (JSONException e) {
                Log.e("JSON Parser", "Error parsing data " + e.toString());
            }

            // retorna el objeto JSON.
            return jObj;
    }

    @Override
    protected void onPostExecute(JSONObject jsonObject) {
        super.onPostExecute(jsonObject);
        activity.callBack(jsonObject);
    }

}
3
ответ дан 24.11.2019, 13:03

Используй следующие переменные и внутри OnCreate

private ArrayList<Objeto> Obj;
private Blank_Frangment fragment;

fragment=(Blank_Fra) getFragmentManager().findFragmentById(R.id.fragment);

ты Можешь использовать функцию JSON прямо с с callback, где ты будешь осуществлять это и в onCreate

try {
        Obj = new ArrayList<E>();
        JSONArray arreglo = jo.getJSONArray("result");
        for (int i = 0; i < arreglo.length(); i++){
            JSONObject objecto = arreglo.getJSONObject(i);
            Clase objetito = new Clase(objecto.getString("Nombre"));
            Obj.add(objetito);
        }
    }catch (Exception e){
    }

    fragment.AgarraArray(Obj);

И используешь эту функцию, где ты имел, он заносит в список

 public void AgarraArray(ArrayList<E> Obj){
    MyAdapter adapter = new MyAdapter(getActivity(),Obj);
    lista.setAdapter(adapter);
}

И помнит этого, что он увеличивает функции q, ты нуждаешься в том, чтобы использовать из-за default, чтобы мочь изменять

MainActivity extends AppCompatActivity implements Blank_Frangment.OnFragmentInteractionListener, JSONCallback

JSONRequest extends AsyncTask <String, Void, JSONObject>

MyAdapter extends BaseAdapter
1
ответ дан 24.11.2019, 13:03

Ты нуждаешься в том, чтобы узнать bÃ: sico AsyncTask, это поможет тебе

public class JSONRequest extends AsyncTask <String, Void, JSONObject>{

private JSONCallback activity;

public JSONRequest(JSONCallback activity){
    this.activity = activity;
}

@Override
protected JSONObject doInBackground(String... params) {
    String json; //Lectura de tu json
    try {
        return new JSONObject(json);
    } catch(Exception e) {
        e.printStackTrace();
    }
    return null;
}

protected void onPostExecute(JSONObject jsonObject) {
    if(jsonObject) {
        activity.callBack(jsonObject);
    } else {
        activity.callError("El json no se ha podido leer");
    }
}

и ты это называешь asà -

new JSONRequest(JSONActivity.this).excecute();

Для чтения твоего json уже зависел бы, откуда ты это достанешь, файла или API, который возвращает json

Ты recomendar¦ - в тот, что ты не использовал AsyncTask для comunicaci¦n с API, или идти из-за специфического контента в сеть, в Android best practices они рекомендуют использование так называемого книжного магазина Retrofit

1
ответ дан 24.11.2019, 13:03

Однажды, осуществленный этот код, чтобы мочь создавать связь внутри app, - очень важен иметь в твоем XML Manifest

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

, и где ты хочешь послать называть request следующей формы

request = new JSONRequest(this); request.execute("pagina");

0
ответ дан 24.11.2019, 13:03

Только recuГ©rdate, что в твоей главной активности ты должен посылать называть это с:

nombre_clase clase = new nombre_clase(actividad);
clase.excute("url");

Как только ты посылаешь называть это в одной funciГіn для того, чтобы я делаю request, и ты должен манипулировать твоим JSONobject с функцией callback.

0
ответ дан 24.11.2019, 13:03

Если ты хочешь схватить локальный файл с папки, он:

try{
        AssetManager manager = getApplicationContext().getAssets();
        InputStream is = manager.open("archivo.txt");
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String currentLine;
        while((currentLine = br.readLine()) != null){
            textres.setText(currentLine);
        }
    }catch (Exception e){
        e.printStackTrace();
    }

И здесь поскольку ты можешь читать файл с твоего каталога raw

try{
        InputStream is = getResources().openRawResource(R.raw.saludo);
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);

        String currenLines;
        currenLines = br.readLine();
        textraw.setText(currenLines);
        is.close();
    }catch (Exception e){
        e.printStackTrace();
    }
0
ответ дан 24.11.2019, 13:03

getView adapter - следующий:

public View getView(int position, View convertView, ViewGroup parent) {

    if(convertView==null){
        convertView=activity.getLayoutInflater().inflate(R.layout.row,null);
    }

    TextView nombre = (TextView) convertView.findViewById(R.id.NombreTextView);
    TextView hobby = (TextView) convertView.findViewById(R.id.hobbyTextView);

    nombre.setText(amigos.get(position).getNombre());
    hobby.setText(amigos.get(position).getHobby());

    return convertView;
}
0
ответ дан 24.11.2019, 13:03

Если ты хочешь сделать файл свойства

private final String FILENAME = "name.xml";

Properties properties;


File file = new File(getFilesDir(), FILENAME);
properties = new Properties();

try{
        if(file.exists()){
            // load values on properties object
            FileInputStream fis = openFileInput(FILENAME);
            properties.loadFromXML(fis);
            fis.close();
        } else {
            save();
        }

    }catch(Exception e){
        e.printStackTrace();
    }

public void save() throws Exception {
    saveProperties();
    FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
    properties.storeToXML(fos, null);
    fos.close();
}

public void saveProperties(){
    properties.setProperty("usuario", inputtext.getText().toString());
}
0
ответ дан 24.11.2019, 13:03

В лишенном Adapter

ArrayList c; Activity activity;

public MyAdapter(ArrayList<Clase> c , Activity activity) {
    this.c = c;
    this.activity = activity;
}
0
ответ дан 24.11.2019, 13:03