Android - определить «контекст» в AsyncTask - PullRequest
0 голосов
/ 09 мая 2018

Я новичок в разработке приложений для Android (даже в Java). У меня есть собственные данные с моих метеостанций, и я декодирую их в фоновом режиме из JSON - что все в порядке, прекрасно.

в функции «onPostExecute» я вызываю другую функцию, называемую «сохранить». И в этой функции мне нужен «контекст».

Как мне определить этот «контекст»? или откуда взять? Не могли бы вы указать мне пример?

Я попробовал несколько вариантов 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();
                }
            }
        }
    }

}

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

В вашем классе 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();
0 голосов
/ 09 мая 2018

Сначала объявите переменную Context в вашем классе fetchData следующим образом:

Context context;

Теперь создайте конструктор для fetchData и примите контекст в качестве аргумента, подобного этому

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

Затем, где бы вы ни находилисьсоздание объекта fetchData передается в контекстную форму этого класса, например

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

Когда вы используете контекст для файла, он будет доступен в вашей переменной контекста класса fetchData.Надеюсь, это поможет.

0 голосов
/ 09 мая 2018

Вы должны передать контекст в FetchData из вашей Activity или где бы вы ни создавали объект FetchData. Если вы не можете понять, как передать его в конструкторе, вы можете просто добавить метод установки, который вы вызываете, перед запуском AsyncTask

...