Как я могу использовать Asynctask в разных действиях?

Я пишу приложение, которое правильно подключается к API Fitbit и извлекает нужные мне данные. У меня есть внутренний класс, расширяющий AsyncTask, который позволяет мне завершить это. Так, например, мой MainActivity.java открывает страницу Fitbit OAuth2, и пользователь входит в систему. Затем пользователя перенаправляют обратно в UserActivity.java, и отображается его информация.

Теперь я хочу добавить еще одно действие, которое извлекает информацию о выполненных действиях. Итак, мой вопрос: нужно ли мне добавить еще один внутренний класс в мой ActivitiesActivity.java или есть другой способ получить данные. Я знаю, что люди использовали интерфейс раньше, но я не уверен, как они работают с AsyncTask.

    package com.jordan.fitbit_connect;

import android.net.Uri;
import android.os.Bundle;
import android.support.customtabs.CustomTabsIntent;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {


    String response_type = "token";
    String client_id = "22CJH3";
    String redirect_uri = "myapplication://login";
    String scope = "activity%20nutrition%20heartrate%20location%20nutrition%20profile%20settings%20sleep%20social%20weight";
    String url = "https://www.fitbit.com/oauth2/authorize?" + "response_type = " + response_type + "&client_id = " + client_id + "&redirect_uri = " + redirect_uri + "&scope = " + scope;


    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//
//        CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder().build();
//        customTabsIntent.launchUrl(this, Uri.parse(url));

            connectToFitbit();
    }

    public void connectToFitbit()
    {
        Button btn = (Button)findViewById(R.id.btnConnect);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder().build();
                customTabsIntent.launchUrl(getApplicationContext(), Uri.parse(url));
            }
        });
    }

}


package com.jordan.fitbit_connect;

import android.content.Intent;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
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 TestActivity extends AppCompatActivity
{

    //String to hold the data sent back by the Intent
    String string;

    //String to extract the token from 'string' above
    private static String token;

    //Strings to get the data from the JSON Object
    public static String name, avatar, age, weight, height;


    TextView username, txtAge, txtWeight, txtHeight, txtBMI;
    float bmi;
    ImageView imgViewAvatar;



    //-------------------------------------- START onNewIntent()------------------------------------
    /*
        This method returns the URI from the Intent as an encoded String
    */
    @Override
    protected void onNewIntent(Intent intent)
    {
        string = intent.getDataString();
    }
    //-------------------------------------- END onNewIntent()--------------------------------------

    //-------------------------------------- START onCreate()---------------------------------------
    /*
        Default method when the class is created
    */
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        onNewIntent(getIntent());

        token = string.substring(string.indexOf("&access_token")+36,308);



        Log.i("TAG", "Access Token: "+ token);
        Log.i("TAG", "Data String: " + string);

        //new JSONTask().execute("https://api.fitbit.com/1.2/user/-/sleep/date/2017-10-26.json");
        //new JSONTask().execute("https://api.fitbit.com/1/user/-/activities/steps/date/today/6m.json");
        new JSONTask().execute("https://api.fitbit.com/1/user/-/profile.json");


    }
    //-------------------------------------- END onCreate()-----------------------------------------



    //-------------------------------------- START of inner class JSONTask -------------------------
     public class JSONTask extends AsyncTask<String,String,String>
    {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            username = (TextView)findViewById(R.id.txtUser);
            imgViewAvatar = (ImageView)findViewById(R.id.imgViewAvatar);
            txtAge = (TextView)findViewById(R.id.txtAge);
            txtWeight = (TextView) findViewById(R.id.txtWeight);
            txtHeight = (TextView) findViewById(R.id.txtHeight);
            txtBMI = (TextView) findViewById(R.id.txtBMI);


        }

        //-------------------------------------- START doInBackground()-----------------------------
        /*
            This method is what happens on the background thread when the
            app is running. It will
        */
        @Override
        protected String doInBackground(String... params)
        {

            HttpURLConnection connection = null;
            BufferedReader reader = null;

            try
            {
                URL url = new URL(params[0]);
                connection = (HttpURLConnection)url.openConnection();
                connection.setRequestMethod("GET");
                connection.setDoOutput(false);
                connection.addRequestProperty("Authorization", "Bearer " + token);
                connection.connect();

                InputStream stream = (InputStream)connection.getInputStream();
                reader = new BufferedReader(new InputStreamReader(stream));

                StringBuffer buffer = new StringBuffer();

                String line = "";

                while((line = reader.readLine()) !=null)
                {
                    buffer.append(line);
                }

                return buffer.toString();

            } catch (MalformedURLException e)
            {

                e.printStackTrace();
            } catch (IOException e)
            {
                e.toString();
            }

            return null;

        }
        //-------------------------------------- END doInBackground()-------------------------------

        //-------------------------------------- START onPostExecute()------------------------------
        @Override
        protected void onPostExecute(String data)
        {
            super.onPostExecute(data);
            Log.i("TAG", data);




           try
            {

                //GET ALL THE JSON DATA
                JSONObject allData = new JSONObject(data);

                //GET THE USERNAME
                JSONObject userObject = allData.getJSONObject("user");
                name = userObject.getString("fullName");
                username.append(" "+name);

                //GET THE USER'S AVATAR
                avatar = userObject.getString("avatar640");
                Picasso.get().load(avatar).into(imgViewAvatar);

                //GET THE USER'S AGE
                age = userObject.getString("age");
                txtAge.append(" "+age);


                weight = userObject.getString("weight");
                txtWeight.append(" "+weight);
                float weightFloat = Float.parseFloat(weight);

                height = userObject.getString("height");
                txtHeight.append(" "+height);
                float heightFloat= Float.parseFloat(height)/100;

                bmi = (float)(weightFloat/(heightFloat * heightFloat));


                if (bmi <= 16)
                {
                    txtBMI.setTextColor(Color.YELLOW);
                    txtBMI.append(" "+ String.valueOf(bmi) + " - You are severely underweight!");
                }
                else if (bmi <= 18.5)
                {
                    txtBMI.setTextColor(Color.GRAY);
                    txtBMI.append(" "+ String.valueOf(bmi) + " - You are underweight!");
                }
                else if (bmi <= 25)
                {
                    txtBMI.setTextColor(Color.GREEN);
                    txtBMI.append(" "+ String.valueOf(bmi) + " - Your weight is normal");
                }
                else if (bmi <= 30)
                {
                    txtBMI.setTextColor(Color.parseColor("#FFA500"));
                    txtBMI.append(" "+ String.valueOf(bmi) + " - You are overweight!");
                }
                else
                {
                    txtBMI.setTextColor(Color.RED);
                    txtBMI.append(" " + String.valueOf(bmi) + " - You are obese!");
                }






               // for(int i =0; i< userObject.length(); i++) {
                    //3.DECLARE ANOTHER JSONOBJECT THAT EXTRACTS THE OBECT FROM THE SPECIFIED ARRAY
                    //JSONObject sleep = sleepArray.getJSONObject(i);

                    //4.Then use a getString to get the data from the object
                    //name = userObject.getString("firstName");
                   // Log.i("TAG",name);


            }
            catch (JSONException e)
            {
                e.printStackTrace();
            }
        }
    }
    //-------------------------------------- END of inner class JSONTask ---------------------------
}

Почему бы вам просто не делать все в mainactivity, тогда, когда пользователь нажимает на другую активность, просто передайте данные, которые вы получаете в asyntask в классе mainactivity

Quick learner 30.03.2018 15:04

также разместите здесь свой код

Quick learner 30.03.2018 15:06

честно говоря, я не очень хорошо понимаю вашу проблему, но я думаю, вам следует написать свой класс, который расширяет AsyncTask как отдельный класс Java, а затем использовать его в различных действиях, где вам нужно. Также вы можете сделать его класс-наследник, если хотите

godot 30.03.2018 15:07

Позвольте мне быстро опубликовать свой код.

Jordy Nelson 30.03.2018 15:07

Привет, быстрый ученик, я отредактировал сообщение, добавив в него свой код. Надеюсь, теперь в этом есть больше смысла. Я понимаю, что означает ваш ответ, однако, чтобы получить другие данные, мне нужно выполнять разные HTTP-запросы. Так, например, данные пользователя и данные активности указывают две разные конечные точки. Я уверен, что вы знаете, как работают вызовы API.

Jordy Nelson 30.03.2018 15:13
0
5
490
1

Ответы 1

Один из методов, использующих AsynTask в разных Activity, создающий интерфейс обратного вызова.

Создайте интерфейс обратного вызова

interface AsyncTaskListener<T> {
    public void onComplete(T result);
}

Потом в ваших Основная деятельность и TestActivity:

public class MainActivity extends AppCompatActivity
       implements AsyncTaskListener<String> {

      public void onComplete(String result) {
              // your staff here
      }
}

public class TestActivity extends AppCompatActivity
       implements AsyncTaskListener<String> {

      public void onComplete(String result) {
              // your staff here
      }
}

И добавьте в свой класс AsyncTask:

public class JSONTask extends AsyncTask<String, String, String>
    private AsyncTaskListener<String> listener;

    public JSONTask (AsyncTaskListener<String> callback) {
        this.listener = callback;
}

    protected void onPostExecute(String result) {
        listener.onComplete(result);  // calling onComplate interface
    }

Другие вопросы по теме