【问题标题】:Android - define "context" in AsyncTaskAndroid - 在 AsyncTask 中定义“上下文”
【发布时间】:2018-05-08 22:16:19
【问题描述】:

我是 Android 应用程序编程的新手(即使在 Java 中也是如此)。 我有自己的气象站数据,我在后台从 JSON 解码它们 - 一切都很好。

在“onPostExecute”函数中,我调用了另一个名为“save”的函数。在这个函数中,我需要“上下文”。

如何定义这个“上下文”?或者我应该从哪里拿走它?你能在我的例子中指导我吗?

我尝试了一些 google 变体,但每次应用程序都停止工作。 (Android 5.1 - Lenovo P70) - 我不能在我的电脑上使用虚拟设备,所以我在连接 Android studio 后直接在我的手机上测试我的应用程序。

如果有任何建议,我将不胜感激。

这里是“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();
                }
            }
        }
    }

}

【问题讨论】:

    标签: java android android-asynctask android-context


    【解决方案1】:

    首先像这样在 fetchData 类中声明一个 Context 变量

    Context context;
    

    现在为 fetchData 创建一个构造函数,并将上下文作为这样的参数

    public fetchData(Context context)
    {
        this.context = context;
    }
    

    然后,无论您在哪里创建 fetchData 对象,都会传递该类的上下文表单

    fetchData fetchObject = new fetchData(this);
    fetchObject.execute();
    

    当您使用文件的上下文时,它将在您的 fetchData 类上下文变量中可用。希望对您有所帮助。

    【讨论】:

    • 感谢您的回答。当我想在 MainActivity.java 中创建新的 fetchData(this) 时:click.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { fetchData fetchObject = new fetchData(this); fetchObject.execute(); } }); 我现在有一个错误(意思是文本'this'),可能问题出在“OnClickListener()”上,你能帮我解决这个问题吗?
    • 把这个改成 MainActivity.this。
    • 很高兴它有帮助。
    【解决方案2】:

    您应该将上下文从您的 Activity 或您正在创建 FetchData 对象的任何位置传递到 FetchData。如果你不知道如何在构造函数中传递它,你可以在运行 AsyncTask 之前添加一个你调用的 setter 方法

    【讨论】:

    • 我可以把它放在哪里?在“onPostExecute”还是在“fetchData”?还是其他地方?
    • 我误读了您的问题,我以为您正在参加活动。我已经编辑了我的答案
    • 谢谢你的回答,你能给我一些例子,在我运行“AsyncTask”之前如何获得一个“上下文”吗?
    • 嗯,您可能正在从您的 Activity 创建和运行任务,因此您可以传入“this”或调用“getApplicationContext”的结果
    • 我试图弄清楚一些事情,但效果不佳。你能帮我继续吗?我在这里创建它:click.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { fetchData process = new fetchData(); process.execute(); } }); 我如何在其中添加“上下文”?在 JAVA 中,很多事情对我来说仍然很困难。 ://
    【解决方案3】:

    在你的类 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();
    

    【讨论】:

    • 感谢您的回答,但我不知道您是否理解我的问题。将数据保存到文本文件时,我在获取“上下文”时遇到问题。
    • 如果您使用我的方式获取上下文,只需执行以下操作:Context context=mainactivity.getApplicationContext();
    • 或者你可以通过类异步任务将上下文传递给你的类,就像这个上下文上下文一样;公共 fetchData(上下文上下文) { this.context = context;}
    猜你喜欢
    • 2011-01-08
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    相关资源
    最近更新 更多