Перенос и повторное использование информации (строка json) из AsyncTask? - PullRequest
0 голосов
/ 02 ноября 2018

Я создал простое приложение для Android с 3 TextViews, а затем запустил задачу AsyncTask через другой класс. Следующим шагом будет передача информации и повторное использование задачи .

Задача будет использовать строку ( URL ) и контекст MainActivity .

Задача сделает простой REST-запрос (GET) и , чтобы получить строку json.

Затем я создал другой класс, который получает ответ json и создает файл .json, сохраняет его в

.... / 0 / Примечания / launch.json

Папка «Заметки» создается мной через file.mkdirs().

В MainActivity я создал InputStream для чтения файла .json, сохраненного AsyncTask, но как только я пытаюсь открыть его, он дает мне FileNotFoundException.

Вот код моего MainActivity.class

package com.example.root.example;

import android.Manifest;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import android.widget.TextView;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

public class MainActivity extends AppCompatActivity {

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

    ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 200);
    String url = "https://api.spacexdata.com/v3/launches/upcoming"; //Copy the url and open it in your browser to see the json.

    AsyncCall asyncCall = new AsyncCall(getApplicationContext());
    asyncCall.myAsyncTask(url);

   try {
        InputStream inputStream = this.getAssets().open("launch.json");
        int size = inputStream.available();
        byte[] buffer = new byte[size];
        inputStream.read(buffer);
        inputStream.close();
        String jsonStringFromFile= new String(buffer,"UTF-8");
        JSONObject launchObject = new JSONObject(jsonStringFromFile);
        System.out.println(launchObject.get("flight_number"));
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }
  }
}

Это AsyncCall.class (создание и получение json и т. Д.)

package com.example.root.example;

import android.content.Context;
import android.os.AsyncTask;
import android.os.Environment;

import java.io.IOException;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class AsyncCall {

FileCreator fileCreator = new FileCreator();
private final Context myContext;

public AsyncCall(final Context context) {
    myContext = context;
}

public void myAsyncTask(final String url) {

    AsyncTask asyncTask = new AsyncTask() {
        @Override
        protected Object doInBackground(Object[] objects) {
            OkHttpClient okHttpClient = new OkHttpClient();
            Request request = new Request.Builder()
                    .url(url)
                    .build();
            Response response = null;
            try {
                response = okHttpClient.newCall(request).execute();
                fileCreator.generateFile(myContext, myContext.getString(R.string.fileName), response.body().string());

            } catch (IOException ioe) {
                ioe.getMessage();
            }
            return null;
        }
    }.execute();
  }
}

что я пытаюсь архивировать? Я пытаюсь сохранить информацию (json здесь) и сделать ее многоразовой, как Falcon 9.

Проблема заключается в переносе информации в другой класс. Если есть альтернативное решение (кроме сохранения файла .json) для решения этой проблемы, пожалуйста, не стесняйтесь его опубликовать.

Это только моя первая проблема, вторая проблема появляется, когда вы открываете api ссылку и видите, что есть несколько больше, чем одна строка JSON (0,1,2,3,4. .. предстоящие миссии).

Я не имею ни малейшего понятия, как решить первую, не говоря уже о второй, проблему, которая начиналась несколько раз, некоторое время назад.

1 Ответ

0 голосов
/ 02 ноября 2018

В своей деятельности вы можете получить JSON, например,

OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
okHttpClient.newCall(request).enqueue(new Callback() {
    @Override
    public void onResponse(Call call, final Response response) throws IOException {  
        try {
            final String responseData = response.body().string();
            JSONObject json = new JSONObject(responseData);

            String flightNumber = json.getString("flight_number");
            // TODO: Load number into a TextView
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
});

Однако, глядя на ваш ответ API, вам на самом деле понадобится new JSONArray(responseData), и вам придется пройтись по нему, чтобы получить номер рейса каждого отдельного объекта

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...