从AsyncTask携带和重用信息(json字符串)?

时间:2018-11-02 18:49:14

标签: java android json android-asynctask

我创建了一个带有3个TextViews的简单android应用,然后通过另一个类运行AsyncTask任务,下一步将是传递信息并使该任务可重复使用

任务将使用字符串( URL )和MainActivity的上下文

该任务将执行一个简单的 REST请求(GET),并获取一个json字符串。

然后我创建了另一个类,该类获取json响应并创建一个.json文件,将其保存到

.... / 0 / Notes / launch.json

“ Notes文件夹是我自己通过file.mkdirs()创建的。

在MainActivity中,我创建了一个InputStream来读取AsyncTask保存的.json文件,但是一旦我尝试打开它,它就会给我一个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 link并看到有不止一个JSON字符串(0,1,2,3,4 ...任务)。

我完全不知道第一个问题,更不用说第二个问题了,而且已经开始了好几次,不久前又开始了。

1 个答案:

答案 0 :(得分:0)

在“活动”中,您可以像这样获得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),并且您必须对其进行循环操作以获取每个对象的航班号