我创建了一个带有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 ...任务)。
我完全不知道第一个问题,更不用说第二个问题了,而且已经开始了好几次,不久前又开始了。
答案 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)
,并且您必须对其进行循环操作以获取每个对象的航班号