Android - 在AsyncTask中定义“上下文”

时间:2018-05-08 22:16:20

标签: java android android-asynctask android-context

我是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();
                }
            }
        }
    }

}

3 个答案:

答案 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类上下文变量中可用。希望它有所帮助。