2017-01-28 2 views
1

Я создал приложение, которое использует json для загрузки данных с сервера и отображает его в ListView, следуя this tutorial. Но теперь я хочу сделать этот процесс в SplashScreen во время загрузки, а затем отправить все загруженные данные в Основная деятельность. Как это можно достичь. Спасибо.AsyncTask в SplashScreen

Мои MainActivity

package tutorial.json.com.jsonparsingtutorial; 

import android.app.Activity; 
import android.net.ParseException; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListView; 
import android.widget.Toast; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.util.EntityUtils; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.IOException; 
import java.util.ArrayList; 

public class MainActivity extends Activity { 

ArrayList<Actors> actorsList; 

ActorAdapter adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    actorsList = new ArrayList<Actors>(); 
    new JSONAsyncTask().execute("http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors"); 

    ListView listview = (ListView)findViewById(R.id.list); 
    adapter = new ActorAdapter(getApplicationContext(), R.layout.row, actorsList); 

    listview.setAdapter(adapter); 

    listview.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int position, 
           long id) { 
      // TODO Auto-generated method stub 
      Toast.makeText(getApplicationContext(), actorsList.get(position).getName(), Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 


public class JSONAsyncTask extends AsyncTask<String, Void, Boolean> { 


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

      //------------------>> 
      HttpGet httppost = new HttpGet(urls[0]); 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpResponse response = httpclient.execute(httppost); 

      // StatusLine stat = response.getStatusLine(); 
      int status = response.getStatusLine().getStatusCode(); 

      if (status == 200) { 
       HttpEntity entity = response.getEntity(); 
       String data = EntityUtils.toString(entity); 


       JSONObject jsono = new JSONObject(data); 
       JSONArray jarray = jsono.getJSONArray("actors"); 

       for (int i = 0; i < jarray.length(); i++) { 
        JSONObject object = jarray.getJSONObject(i); 

        Actors actor = new Actors(); 

        actor.setName(object.getString("name")); 
        actor.setDescription(object.getString("description")); 
        actor.setDob(object.getString("dob")); 
        actor.setCountry(object.getString("country")); 
        actor.setHeight(object.getString("height")); 
        actor.setSpouse(object.getString("spouse")); 
        actor.setChildren(object.getString("children")); 
        actor.setImage(object.getString("image")); 

        actorsList.add(actor); 
       } 
       return true; 
      } 

      //------------------>> 

     } catch (ParseException e1) { 
      e1.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return false; 
    } 


    protected void onPostExecute(Boolean result) { 
     adapter.notifyDataSetChanged(); 
     if(result == false) 
      Toast.makeText(getApplicationContext(), "Unable to fetch data from server", Toast.LENGTH_LONG).show(); 

    } 
} 
} 

Актер адаптер

package tutorial.json.com.jsonparsingtutorial; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

import java.io.InputStream; 
import java.util.ArrayList; 

public class ActorAdapter extends ArrayAdapter<Actors> { 
ArrayList<Actors> actorList; 
LayoutInflater vi; 
int Resource; 
ViewHolder holder; 

public ActorAdapter(Context context, int resource, ArrayList<Actors> objects) { 
    super(context, resource, objects); 
    vi = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    Resource = resource; 
    actorList = objects; 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // convert view = design 
    View v = convertView; 
    if (v == null) { 
     holder = new ViewHolder(); 
     v = vi.inflate(Resource, null); 
     holder.imageview = (ImageView) v.findViewById(R.id.ivImage); 
     holder.tvName = (TextView) v.findViewById(R.id.tvName); 
     holder.tvDescription = (TextView) v.findViewById(R.id.tvDescriptionn); 
     holder.tvDOB = (TextView) v.findViewById(R.id.tvDateOfBirth); 
     holder.tvCountry = (TextView) v.findViewById(R.id.tvCountry); 
     holder.tvHeight = (TextView) v.findViewById(R.id.tvHeight); 
     holder.tvSpouse = (TextView) v.findViewById(R.id.tvSpouse); 
     holder.tvChildren = (TextView) v.findViewById(R.id.tvChildren); 
     v.setTag(holder); 
    } else { 
     holder = (ViewHolder) v.getTag(); 
    } 
    holder.imageview.setImageResource(R.drawable.ic_launcher); 
    new DownloadImageTask(holder.imageview).execute(actorList.get(position).getImage()); 
    holder.tvName.setText(actorList.get(position).getName()); 
    holder.tvDescription.setText(actorList.get(position).getDescription()); 
    holder.tvDOB.setText("B'day: " + actorList.get(position).getDob()); 
    holder.tvCountry.setText(actorList.get(position).getCountry()); 
    holder.tvHeight.setText("Height: " + actorList.get(position).getHeight()); 
    holder.tvSpouse.setText("Spouse: " + actorList.get(position).getSpouse()); 
    holder.tvChildren.setText("Children: " + actorList.get(position).getChildren()); 
    return v; 

} 

static class ViewHolder { 
    public ImageView imageview; 
    public TextView tvName; 
    public TextView tvDescription; 
    public TextView tvDOB; 
    public TextView tvCountry; 
    public TextView tvHeight; 
    public TextView tvSpouse; 
    public TextView tvChildren; 

} 

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 
    ImageView bmImage; 

    public DownloadImageTask(ImageView bmImage) { 
     this.bmImage = bmImage; 
    } 

    protected Bitmap doInBackground(String... urls) { 
     String urldisplay = urls[0]; 
     Bitmap mIcon11 = null; 
     try { 
      InputStream in = new java.net.URL(urldisplay).openStream(); 
      mIcon11 = BitmapFactory.decodeStream(in); 
     } catch (Exception e) { 
      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 
     return mIcon11; 
    } 

    protected void onPostExecute(Bitmap result) { 
     bmImage.setImageBitmap(result); 
    } 

} 
} 

Актер класс

package tutorial.json.com.jsonparsingtutorial; 

public class Actors { 

private String name; 
private String description; 
private String dob; 
private String country; 
private String height; 
private String spouse; 
private String children; 
private String image; 

public Actors() { 
    // TODO Auto-generated constructor stub 
} 

public Actors(String name, String description, String dob, String country, 
       String height, String spouse, String children, String image) { 
    super(); 
    this.name = name; 
    this.description = description; 
    this.dob = dob; 
    this.country = country; 
    this.height = height; 
    this.spouse = spouse; 
    this.children = children; 
    this.image = image; 
} 


public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

public String getDob() { 
    return dob; 
} 

public void setDob(String dob) { 
    this.dob = dob; 
} 

public String getCountry() { 
    return country; 
} 

public void setCountry(String country) { 
    this.country = country; 
} 

public String getHeight() { 
    return height; 
} 

public void setHeight(String height) { 
    this.height = height; 
} 

public String getSpouse() { 
    return spouse; 
} 

public void setSpouse(String spouse) { 
    this.spouse = spouse; 
} 

public String getChildren() { 
    return children; 
} 

public void setChildren(String children) { 
    this.children = children; 
} 

public String getImage() { 
    return image; 
} 

public void setImage(String image) { 
    this.image = image; 
} 

} 
+0

Ну вы можете пройти ArrayList с помощью намерения HTTP://stackoverflow.com/questions/21250339/how-to-pass-arraylistcustomeobject-from-one-activity-to-another –

+0

попробовал, но приложение рушится. Было бы очень полезно, если бы вы могли показать, что делать –

ответ

3

Вам нужно создать Sp lashScrenActivity и загрузите данные с помощью JSONAsyncTask и после получения ответа. В onPost вы должны запустить MainActivity и отправить загруженные данные в MainActivity. Пока выполняется JSONAsyncTask, вы можете показывать ProgressBar в onPreExecute и скрывать ProgressBar в onPostExecute.

Чтобы отправить данные в MainActivity, вам необходимо сделать свой класс Actor Parcelable Interface. После того, как актер Класс реализует Parcelable, Это, как вы можете отправить данные из SplashScreenActivity в MainActivty -

В SplashScreenActivity,

Intent intent = new Intent(SplashScreenActivity.this,MainActivty.class); 
intent.putParcelableArrayListExtra("ActorsList", actorsArrayList); 
startActivity(intent); 

В MainActivty OnCreate() вы получите ActorsList используя,

if (getIntent().hasExtra("ActorsList")) { 

      ArrayList<Actors> actorsList = 
        getIntent().getParcelableArrayListExtra("ActorsList"); 
} 

Это будет ваш Участвующий класс,

public class Actors implements Parcelable { 

    private String name; 
    private String description; 
    private String dob; 
    private String country; 
    private String height; 
    private String spouse; 
    private String children; 
    private String image; 

    public Actors() { 
     // TODO Auto-generated constructor stub 
    } 

    public Actors(String name, String description, String dob, String country, 
        String height, String spouse, String children, String image) { 
     super(); 
     this.name = name; 
     this.description = description; 
     this.dob = dob; 
     this.country = country; 
     this.height = height; 
     this.spouse = spouse; 
     this.children = children; 
     this.image = image; 
    } 


    protected Actors(Parcel in) { 
     name = in.readString(); 
     description = in.readString(); 
     dob = in.readString(); 
     country = in.readString(); 
     height = in.readString(); 
     spouse = in.readString(); 
     children = in.readString(); 
     image = in.readString(); 
    } 

    public static final Creator<Actors> CREATOR = new Creator<Actors>() { 
     @Override 
     public Actors createFromParcel(Parcel in) { 
      return new Actors(in); 
     } 

     @Override 
     public Actors[] newArray(int size) { 
      return new Actors[size]; 
     } 
    }; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public String getDob() { 
     return dob; 
    } 

    public void setDob(String dob) { 
     this.dob = dob; 
    } 

    public String getCountry() { 
     return country; 
    } 

    public void setCountry(String country) { 
     this.country = country; 
    } 

    public String getHeight() { 
     return height; 
    } 

    public void setHeight(String height) { 
     this.height = height; 
    } 

    public String getSpouse() { 
     return spouse; 
    } 

    public void setSpouse(String spouse) { 
     this.spouse = spouse; 
    } 

    public String getChildren() { 
     return children; 
    } 

    public void setChildren(String children) { 
     this.children = children; 
    } 

    public String getImage() { 
     return image; 
    } 

    public void setImage(String image) { 
     this.image = image; 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel parcel, int i) { 
     parcel.writeString(name); 
     parcel.writeString(description); 
     parcel.writeString(dob); 
     parcel.writeString(country); 
     parcel.writeString(height); 
     parcel.writeString(spouse); 
     parcel.writeString(children); 
     parcel.writeString(image); 
    } 
} 

и в onPostExecute вам просто нужно начать MainActivity, как показано ниже,

Intent intent = new Intent(context, MainActivity.class); 
intent.putParcelableArrayListExtra("ActorsList", actorsArrayList); 
startActivity(intent); 

Для получения дополнительной информации о том, как сделать класс parcelable пожалуйста, обратитесь по ссылке ниже - How can I make my custom objects Parcelable?

+0

можете ли вы рассказать мне, как реализовать Parcelable Interface в классе Actor –

+0

, и я отправлю данные в onPostExecute ??? –

+0

thanx много .... –