-2

I am beginer in Android programming and this is my biggest project as of yet.Please try to be very specific in your answers because all this is very new to me. What i want to do is display the value of weather(Description) in my textview in OneFragment.`

Here is MainActivity

package com.example.dell.myop;

import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;


import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;

import com.example.dell.myop.R;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.widget.TextView;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;


import com.example.dell.myop.fragments.OneFragment;

import com.example.dell.myop.fragments.ThreeFragment;
import com.example.dell.myop.fragments.TwoFragment;

public class MainActivity extends AppCompatActivity {

    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    String description;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DownloadTask task = new DownloadTask();
        task.execute("http://api.openweathermap.org/data/2.5/weather?q=hamirpur,india&appid=41352ca35dd1be72cc7d9f47351d1b41");

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new OneFragment(), "Today");
        adapter.addFragment(new TwoFragment(), "Tomorrow");
        adapter.addFragment(new ThreeFragment(), "Day After");
        viewPager.setAdapter(adapter);
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }
}

DownloadTask

package com.example.dell.myop;

import android.content.Intent;
import android.os.AsyncTask;
import android.util.Log;

import com.example.dell.myop.fragments.OneFragment;

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

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import static android.support.v4.app.ActivityCompat.startActivity;

public class DownloadTask extends AsyncTask<String,Void,String> {

    @Override
    protected String doInBackground(String... urls) {

        String result = "";
        URL url;
        HttpURLConnection urlConnection= null;

        try {
            url = new URL(urls[0]);
            urlConnection = (HttpURLConnection) url.openConnection();
            InputStream in = urlConnection.getInputStream();
            InputStreamReader reader = new InputStreamReader(in);
            int data = reader.read();
            while(data!=-1){
                char current = (char)data;
                result += current;
                data = reader.read();
            }
            return  result;

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

        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        try {
            JSONObject jObject = new JSONObject(result);
            JSONArray jArray = jObject.getJSONArray("weather");
            for (int i=0; i < jArray.length(); i++)
            {
                try {
                    JSONObject oneObject = jArray.getJSONObject(i);
                    // Pulling items from the array
                    String main = oneObject.getString("main");
                    String description = oneObject.getString("description");
                    Log.i("main",main);
                    Log.i("description",description);

                } catch (JSONException e) {
                    // Oops
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

And here is OneFragment

package com.example.dell.myop.fragments;

/**
 * Created by Dell on 13-09-2016.
 */
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.example.dell.myop.DownloadTask;
import com.example.dell.myop.MainActivity;
import com.example.dell.myop.R;

import com.example.dell.myop.R;


public class OneFragment extends Fragment{

    public OneFragment() {

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_one, container, false);
        TextView textView = (TextView) view.findViewById(R.id.textView);

        textView.setText(description);
        return view;
    }    
}
Shivam Dhuria
  • 35
  • 1
  • 7
  • Both of the below answers essentially follow this answer http://stackoverflow.com/questions/12575068/how-to-get-the-result-of-onpostexecute-to-main-activity-because-asynctask-is-a – OneCricketeer Oct 01 '16 at 04:23

2 Answers2

1

I advise you to move the logic of downloadTask in your frargment , if you will used it just in this one. and it will be very easy so , to just get the description and set :

textView.setText(description); in your fragment,

If you wanna use this downloadTask on other components of your activity, you have to implements some CallBack on your activity and use them on any fragment to update UI. So let say in your Activity you declare some interface

 interface OnDownloadTaskFinish {
 onFinish(String description);
 }

use it in

 onPostExecute(...){
 //...some logic here 
 getFragment..... .onFinish(description);
} 

in your Fragment you should implements this interface and

 void onFinish(String description){
 textView.setText(description);
 }
issamux
  • 1,336
  • 1
  • 19
  • 35
0

1) Create an interface in your DownloadTask, its setter and notification code as

private Listener listener;

public void setListener(Listener listener){
    this.listener = listener;
}

public interface Listener{
    onCompleted(String description);
}

@Override
protected void onPostExecute(String result) {
    // Your Current Code

    if(listener != null) listener.onCompleted(description);
}

2) Implement this interface in your OneFragment

public class OneFragment extends Fragment implements DownloadTask.Listener{

     private TextView textView;

     @Override
     onCompleted(String description){
         if(description != null && textView !=null)
             textView.setDescription(description);
     }

     // Other code
}

3) Create global reference to OneFragment and set it as Listener for DownloadTask in MainActivity as

private OneFragment oneFragment = new OneFragment();

4) Replace adapter.addFragment(new OneFragment(), "Today"); by adapter.addFragment(oneFragment, "Today");

5) Set Listener as

DownloadTask task = new DownloadTask();
task.setListener(oneFragment);
task.execute("http://api.openweathermap.org/data/2.5/weather?q=hamirpur,india&appid=41352ca35dd1be72cc7d9f47351d1b41");

6) It would be better to execute DowloadTask after viewPager.setAdapter(adapter);