我是Android应用程序编程的新手(甚至是Java)。 我有来自气象站的数据,我在JSON的后台解码它们 - 所有人都很好。
在“onPostExecute”函数中,我调用另一个名为“save”的函数。在这个功能中我需要“上下文”。
如何定义此“上下文”?或者我应该从哪里拿走它?你能用我的例子来指导我吗?
我尝试了一些谷歌变种,但每次应用程序停止工作。 (Android 5.1 - Lenovo P70) - 我无法在计算机上使用虚拟设备,所以我在连接Android工作室后直接在手机上测试我的应用程序。
我将不胜感激任何建议。
这是“fetchData.java”,其中包含一个函数“fetchData”,当我触摸按钮时,该函数从“MainActivity.java”调用。
package arduino.weatherstation;
import android.content.Context;
import android.os.AsyncTask;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class fetchData extends AsyncTask<String,String,String> {
String data = "";
private String dataParsed = "";
private String singleParsed = "";
private String last_data = "";
private static final String FILE_NAME = "lastdata.txt";
@Override
protected String doInBackground(String... params) {
String result = "";
try {
URL url = new URL("https://***.cz");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line = "";
while(line != null) {
line = bufferedReader.readLine();
data = data + line;
}
JSONArray JA = new JSONArray(data);
for(int i = 0; i < JA.length(); i++) {
JSONObject JO = (JSONObject) JA.get(i);
singleParsed = "Day:" + JO.get("Day") + "\n"+
"Time:" + JO.get("Time") + "\n"+
"Temperature:" + JO.get("Temperature") + "\n"+
"Humidity:" + JO.get("Humidity") + "\n"+
"Pressure:" + JO.get("Pressure") + "\n"+
"Light:" + JO.get("Light") + "\n"+
"Rain:" + JO.get("Rain") + "\n"+
"City:" + JO.get("City") + "\n"+
"Country:" + JO.get("Country") + "\n"+
"Id:" + JO.get("Id") + "\n";
dataParsed = dataParsed + singleParsed;
if(i == (JA.length() - 1)) {
last_data = "Day:" + JO.get("Day") + "\n"+
"Time:" + JO.get("Time") + "\n"+
"Temperature:" + JO.get("Temperature") + "\n"+
"Humidity:" + JO.get("Humidity") + "\n"+
"Pressure:" + JO.get("Pressure") + "\n"+
"Light:" + JO.get("Light") + "\n"+
"Rain:" + JO.get("Rain") + "\n"+
"City:" + JO.get("City") + "\n"+
"Country:" + JO.get("Country") + "\n"+
"Id:" + JO.get("Id") + "\n";
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return result;
}
@Override
protected void onPostExecute(String aVoid) {
super.onPostExecute(aVoid);
MainActivity.data.setText(last_data);
save(last_data);
}
public void save(String toSave) {
String text = toSave;
FileOutputStream fos = null;
try {
fos = context.openFileOutput(FILE_NAME, Context.MODE_PRIVATE);
fos.write(text.getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
答案 0 :(得分:0)
您应该从您的Activity或您创建FetchData对象的任何位置将上下文传递给FetchData。如果你无法弄清楚如何在构造函数中传递它,你可以添加一个在运行AsyncTask之前调用的setter方法
答案 1 :(得分:0)
在您的类MainActivity.class中添加一个方法来将文本设置为TextView:
public void setTextMsg(String msg){
TextView txtv=(TextView) R.id.findViewById(R.id.txtMsg);
txtv.setText(msg);
}
您可以尝试在类AsyncTask(fetchData)中添加它:
private MainActivity mainactivity;
public void setMainActivity(MainActivity mainactivity){
this.mainactivity=mainactivity;
}
在postExecute(){}中。添加以下行:
mainactivity.setTextMsg(last_data)
注意:当您可以调用AsyncTask时:
fetchData dataThread=new fetchData();
dataThread.setMainActivity(MainActivity.this);
dataThread.execute();
答案 2 :(得分:0)
首先在fetchData类中声明一个Context变量,如下所示
Context context;
现在为fetchData创建一个构造函数,并将上下文作为参数,如此
public fetchData(Context context)
{
this.context = context;
}
然后,无论您在何处创建fetchData对象,都要传递类似
的上下文形式fetchData fetchObject = new fetchData(this);
fetchObject.execute();
当您使用文件上下文时,它将在您的fetchData类上下文变量中可用。希望它有所帮助。