TransactionTooLargeException в Activity на более новых версиях Android
Моя активность вызывает исключение TransactionTooLargeException, из-за которого происходит сбой моего приложения. Я не могу понять, где и почему это происходит, и поэтому я не могу найти быстрое решение. Пожалуйста, помогите мне. Вот мой код:
public class ProjectList extends AppCompatActivity implements RecyclerView.OnItemTouchListener {
String SCREEN_NAME="Project List";
private Tracker mTracker;
private GoogleApiClient mClient;
private Uri mUrl;
private String mTitle;
private String mDescription;
private List<ProjectGetSet> persons;
private RecyclerView rv;
public static final String PREFS_NAME = "PREF";
SharedPreferences settings;
SharedPreferences.Editor editor;
DatabaseHandler databaseHandler;
TLAPI tlapi;
TLConstants tlConstants;
private boolean loading = true;
int pastVisiblesItems, visibleItemCount, totalItemCount;
LinearLayoutManager llm;
int pageNumber=1;
String id;
TextView tvMessage,tvFilterMsg;
Button btnBrowse;
private SwipeRefreshLayout swipeContainer;
TextView tvLatest, tvPopular, tvBudget,tvEnding,tvFeatured;
String sort="";
String q = "";
ImageButton btnSearch;
EditText etSearch;
public ProjectList()
{
}
private OnItemClickListener mListener;
public interface OnItemClickListener {
public void onItemClick(View view, int position);
}
GestureDetector mGestureDetector;
public ProjectList(Context context, OnItemClickListener listener) {
mListener = listener;
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
View childView = view.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
AppIndexConstants appIndexConstants=new AppIndexConstants();
mClient = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
mUrl = appIndexConstants.jobList;
mTitle = appIndexConstants.joblistTitle;
mDescription = appIndexConstants.joblistDescription;
setContentView(R.layout.activity_find_project);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
rv = (RecyclerView)findViewById(R.id.rv);
etSearch = (EditText) findViewById(R.id.etSearch);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle("Find Jobs");
etSearch.clearFocus();
tlapi=new TLAPI(getApplicationContext());
tlConstants=new TLConstants(getApplicationContext());
settings=getApplicationContext().getSharedPreferences(PREFS_NAME, 0);
editor = settings.edit();
onNewIntent(getIntent());
databaseHandler=new DatabaseHandler(getApplicationContext());
if(databaseHandler.getRowCountLoginAuth()<=0) {
Toast.makeText(getApplicationContext(),"Please login",Toast.LENGTH_LONG).show();
Intent intent;
intent = new Intent(getApplicationContext(), WalkThrough.class);
startActivity(intent);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
}
rv.setHasFixedSize(true);
llm = new LinearLayoutManager(getApplicationContext());
rv.setLayoutManager(llm);
tvLatest=(TextView)findViewById(R.id.tvLatest);
tvPopular=(TextView)findViewById(R.id.tvPopular);
tvBudget=(TextView)findViewById(R.id.tvBudget);
btnSearch = (ImageButton) findViewById(R.id.btnSearch);
tvEnding=(TextView)findViewById(R.id.tvEnding);
tvFeatured=(TextView)findViewById(R.id.tvFeatured);
tvMessage=(TextView)findViewById(R.id.tvMessage);
tvFilterMsg=(TextView)findViewById(R.id.tvFilterMsg);
swipeContainer = (SwipeRefreshLayout) findViewById(R.id.swipeContainer);
btnBrowse=(Button)findViewById(R.id.btnBrowse);
etSearch.setText("");
AnalyticsApplication application = (AnalyticsApplication) getApplication();
mTracker = application.getDefaultTracker();
Log.i("ANALYTICS", "Setting screen name: " + SCREEN_NAME);
mTracker.setScreenName("Screen~" + SCREEN_NAME);
mTracker.send(new HitBuilders.ScreenViewBuilder().build());
GoogleAnalytics.getInstance(this).dispatchLocalHits();
mTracker.send(new HitBuilders.EventBuilder()
.setCategory("find_jobs")
.setAction("viewed")
.build());
editor.putString("shortlisted", "0");
editor.putString("show", "all");
editor.putString("sort", "");
editor.putString("dontshowreject", "1");
if(settings.getString("currency","").equalsIgnoreCase("INR")) {
editor.putString("proposalFilterMinVal", "0");
editor.putString("projectFilterMaxVal", "300000");
}
else
{
editor.putString("proposalFilterMinVal", "0");
editor.putString("projectFilterMaxVal", "5000");
}
editor.putString("proposalFilterMaxValRating","5");
editor.putString("proposalFilterMinValRating", "0");
editor.putString("filterAppliedProposal", "");
editor.putString("projectFilterSubCategory","");
editor.putString("selectedCategoryID","");
editor.apply();
if(settings.getString("filterApplied","").equalsIgnoreCase("1"))
{
tvFilterMsg.setVisibility(View.VISIBLE);
}
else
{
tvFilterMsg.setVisibility(View.GONE);
}
btnSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (etSearch.getText().length() > 0) {
editor.putString("filterApplied","1");
editor.apply();
q = etSearch.getText().toString();
initializeData();
initializeAdapter();
}
}
});
tvPopular.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTracker.send(new HitBuilders.EventBuilder()
.setCategory("find_jobs")
.setLabel("popular")
.setAction("viewed")
.build());
tvLatest.setTextColor(getResources().getColor(R.color.grey_400));
tvBudget.setTextColor(getResources().getColor(R.color.grey_400));
tvEnding.setTextColor(getResources().getColor(R.color.grey_400));
tvFeatured.setTextColor(getResources().getColor(R.color.grey_400));
tvPopular.setTextColor(getResources().getColor(R.color.white));
sort = "popular";
initializeData();
initializeAdapter();
}
});
tvBudget.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTracker.send(new HitBuilders.EventBuilder()
.setCategory("find_jobs")
.setLabel("desc")
.setAction("viewed")
.build());
tvLatest.setTextColor(getResources().getColor(R.color.grey_400));
tvBudget.setTextColor(getResources().getColor(R.color.white));
tvEnding.setTextColor(getResources().getColor(R.color.grey_400));
tvFeatured.setTextColor(getResources().getColor(R.color.grey_400));
tvPopular.setTextColor(getResources().getColor(R.color.grey_400));
sort="desc";
initializeData();
initializeAdapter();
}
});
tvFeatured.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTracker.send(new HitBuilders.EventBuilder()
.setCategory("find_jobs")
.setLabel("desc")
.setAction("viewed")
.build());
tvLatest.setTextColor(getResources().getColor(R.color.grey_400));
tvPopular.setTextColor(getResources().getColor(R.color.grey_400));
tvBudget.setTextColor(getResources().getColor(R.color.grey_400));
tvEnding.setTextColor(getResources().getColor(R.color.grey_400));
tvFeatured.setTextColor(getResources().getColor(R.color.white));
sort="featured";
initializeData();
initializeAdapter();
}
});
tvEnding.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTracker.send(new HitBuilders.EventBuilder()
.setCategory("find_jobs")
.setLabel("desc")
.setAction("viewed")
.build());
tvLatest.setTextColor(getResources().getColor(R.color.grey_400));
tvPopular.setTextColor(getResources().getColor(R.color.grey_400));
tvBudget.setTextColor(getResources().getColor(R.color.grey_400));
tvEnding.setTextColor(getResources().getColor(R.color.white));
tvFeatured.setTextColor(getResources().getColor(R.color.grey_400));
sort="ending";
initializeData();
initializeAdapter();
}
});
btnBrowse.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btnBrowse.setVisibility(View.GONE);
tvMessage.setVisibility(View.GONE);
swipeContainer.setVisibility(View.VISIBLE);
editor.putString("projectFilterSkills", "");
if(settings.getString("currency","").equalsIgnoreCase("INR")) {
editor.putString("projectFilterMaxVal", "300000");
}
else
{
editor.putString("projectFilterMaxVal", "5000");
}
editor.putString("projectFilterMinVal","0");
editor.putString("filterApplied","");
editor.apply();
initializeData();
initializeAdapter();
}
});
tvLatest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTracker.send(new HitBuilders.EventBuilder()
.setCategory("find_jobs")
.setLabel("latest")
.setAction("viewed")
.build());
tvLatest.setTextColor(getResources().getColor(R.color.white));
tvPopular.setTextColor(getResources().getColor(R.color.grey_400));
tvBudget.setTextColor(getResources().getColor(R.color.grey_400));
tvEnding.setTextColor(getResources().getColor(R.color.grey_400));
tvFeatured.setTextColor(getResources().getColor(R.color.grey_400));
sort="";
initializeData();
initializeAdapter();
}
});
// Setup refresh listener which triggers new data loading
swipeContainer.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
// Your code to refresh the list here.
// Make sure you call swipeContainer.setRefreshing(false)
// once the network request has completed successfully.
tvFilterMsg.setVisibility(View.GONE);
etSearch.setText("");
q="";
editor.putString("projectFilterSkills","");
if(settings.getString("currency","").equalsIgnoreCase("INR")) {
editor.putString("projectFilterMaxVal", "300000");
}
else
{
editor.putString("projectFilterMaxVal", "5000");
}
editor.putString("projectFilterMinVal","0");
editor.putString("filterApplied","");
editor.putString("projectFilterCategory","");
editor.putString("projectFilterSubCategory","");
editor.putString("selectedCategoryID","");
editor.apply();
initializeData();
initializeAdapter();
}
});
// Configure the refreshing colors
swipeContainer.setColorSchemeResources(android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
rv.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if(dy > 0) //check for scroll down
{
visibleItemCount = llm.getChildCount();
totalItemCount = llm.getItemCount();
pastVisiblesItems = llm.findFirstVisibleItemPosition();
Log.d("Visible Item Count",""+visibleItemCount);
Log.d("Total Item Count",""+totalItemCount);
Log.d("Past Item Count",""+pastVisiblesItems);
if (loading)
{
if ( (visibleItemCount + pastVisiblesItems) >= totalItemCount)
{
mTracker.send(new HitBuilders.ScreenViewBuilder().build());
GoogleAnalytics.getInstance(getApplicationContext()).dispatchLocalHits();
Log.v("...", "Scrolling");
loading = false;
Log.v("...", "Last Item Wow !");
//Do pagination.. i.e. fetch new data
String page=String.valueOf(pageNumber);
getList(page);
}
}
}
}
});
rv.addOnItemTouchListener(
new ProjectList(getApplicationContext(), new ProjectList.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
// TODO Handle item click
// Toast.makeText(getApplicationContext(),"Project number :"+id,Toast.LENGTH_SHORT).show();
editor.putString("project_id",persons.get(position).id);
editor.putString("isProposal", "0");
editor.apply();
Intent i=new Intent(getApplicationContext(),ProjectDetails.class);
startActivity(i);
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
}
})
);
initializeData();
initializeAdapter();
}
public Action getAction() {
Thing object = new Thing.Builder()
.setName(mTitle)
.setDescription(mDescription)
.setUrl(mUrl)
.build();
return new Action.Builder(Action.TYPE_VIEW)
.setObject(object)
.setActionStatus(Action.STATUS_TYPE_COMPLETED)
.build();
}
@Override
public void onStart() {
super.onStart();
mClient.connect();
AppIndex.AppIndexApi.start(mClient, getAction());
}
@Override
protected void onResume() {
super.onResume();
if(settings.getString("filterApplied","").equalsIgnoreCase("1"))
{
tvLatest.setTextColor(getResources().getColor(R.color.white));
tvPopular.setTextColor(getResources().getColor(R.color.grey_400));
tvBudget.setTextColor(getResources().getColor(R.color.grey_400));
tvEnding.setTextColor(getResources().getColor(R.color.grey_400));
tvFeatured.setTextColor(getResources().getColor(R.color.grey_400));
sort="";
pageNumber=1;
initializeData();
initializeAdapter();
}
else if(settings.getString("filterApplied","").equalsIgnoreCase("0"))
{
initializeData();
initializeAdapter();
}
else
{
tvFilterMsg.setVisibility(View.GONE);
tvMessage.setVisibility(View.GONE);
rv.setVisibility(View.VISIBLE);
}
}
private void initializeData(){
if(settings.getString("filterApplied","").equalsIgnoreCase("1")) {
tvFilterMsg.setVisibility(View.VISIBLE);
}
else
{
tvFilterMsg.setVisibility(View.GONE);
}
tvMessage.setVisibility(View.GONE);
rv.setVisibility(View.VISIBLE);
persons = new ArrayList<>();
getList("1");
}
ProjectListRVAdapter adapter;
private void initializeAdapter(){
adapter = new ProjectListRVAdapter(persons);
rv.setAdapter(adapter);
}
private void notifyAdapter()
{
adapter.notifyDataSetChanged();
}
HashMap<String,String> databaseUserMap;
ProgressDialog dialog;
private void getList(final String page)
{
dialog = ProgressDialog.show(ProjectList.this, "", "Please Wait...", true);
String endPoint=tlConstants.projectList;
HashMap<String,String> params = new HashMap<String, String>();
DatabaseHandler databaseHandler=new DatabaseHandler(getApplicationContext());
HashMap<String,String> databaseMap=databaseHandler.getUserLoginAuthDetails();
databaseUserMap=databaseHandler.getUserBasicDetails();
params.put("access_token",databaseMap.get("accesstoken"));
params.put("page",page);
params.put("q", q);
params.put("sort",sort);
params.put("skill_matching",settings.getString("projectFilterSkills",""));
if(settings.getString("currency","").equalsIgnoreCase("INR")) {
params.put("pmax", settings.getString("projectFilterMaxVal", "300000"));
}
else
{
params.put("pmax", settings.getString("projectFilterMaxVal", "5000"));
}
params.put("pmin",settings.getString("projectFilterMinVal",""));
params.put("category",settings.getString("projectFilterCategory",""));
params.put("currency",settings.getString("currency",""));
Log.d("Request Params",params.toString());
tlapi.makeAPIcall(new TLAPI.VolleyCallback(){
@Override
public void onSuccess(String result){
//do stuff here
Log.d("RESULT",result);
if(dialog!=null) {
if (dialog.isShowing()) {
dialog.dismiss();
}
}
swipeContainer.setRefreshing(false);
try {
JSONObject outerJSON=new JSONObject(result);
if (outerJSON.getInt("status")==1) {
JSONObject dataObject=outerJSON.getJSONObject("projects");
JSONArray dataArray=dataObject.getJSONArray("data");
int i;
for(i=0;i<dataArray.length();i++)
{
JSONObject dataArrayObject=dataArray.getJSONObject(i);
JSONObject displayjobtypeObject=dataArrayObject.getJSONObject("displayjobtype");
String title=dataArrayObject.getString("title");
id=dataArrayObject.getString("id");
Log.d("ID",id);
String currency=dataArrayObject.getString("currency");
String budget = tlConstants.amountSymbol(dataArrayObject.getString("budget"), currency);
if(displayjobtypeObject.getString("actualvalue").equalsIgnoreCase("3"))//Hourly project
{
budget = tlConstants.amountSymbol(dataArrayObject.getString("budget"), currency)+"/Hr";
}
String proposalNum=dataArrayObject.getString("total_proposals");
String isFeatured=dataArrayObject.getString("featured");
String isNDA = dataArrayObject.getString("addon_nda");
String isRecruiter = dataArrayObject.getString("addon_recruiter");
String isPrivate = dataArrayObject.getString("addon_private");
String isUrgent = dataArrayObject.getString("addon_urgent");
String skills="Skills: ";
JSONArray skillsArray=dataArrayObject.getJSONArray("skills");
int j;
for (j = 0; j < skillsArray.length(); j++) {
JSONObject skillObject = skillsArray.getJSONObject(j);
String temp = skillObject.getString("tag");
temp = temp.replace("_", " ");
skills = skills + temp + ", ";
}
skills=skills.replaceAll(", $","");
persons.add(new ProjectGetSet(title, budget, proposalNum,skills,id,isFeatured,isNDA,isPrivate,isRecruiter,isUrgent));
}
Log.d("Person Length",persons.size()+"");
loading=true;
pageNumber=pageNumber+1;
notifyAdapter();
}
else
{
if(pageNumber>1)
{
Toast.makeText(getApplicationContext(),"No more data",Toast.LENGTH_SHORT).show();
}
else {
rv.setVisibility(View.GONE);
tvMessage.setVisibility(View.VISIBLE);
tvMessage.setText(outerJSON.getString("message"));
}
}
}
catch(JSONException e)
{
Log.d("Exception",e.toString());
}
}
},endPoint,params);
}
@Override
protected void onStop() {
AppIndex.AppIndexApi.end(mClient, getAction());
mClient.disconnect();
super.onStop();
if ((dialog != null) && dialog.isShowing()) {
dialog.dismiss();
dialog = null;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.findfreelancer, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == android.R.id.home) {
onBackPressed();
return true;
}
if (id == R.id.action_search) {
mTracker.send(new HitBuilders.EventBuilder()
.setCategory("find_jobs")
.setAction("clicked_filter")
.build());
Intent intent=new Intent(getApplicationContext(),ProjectFilter.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
protected void onNewIntent(Intent intent) {
String action = intent.getAction();
String data = intent.getDataString();
if (Intent.ACTION_VIEW.equals(action) && data != null) {
String id = data.substring(data.lastIndexOf("/") + 1);
editor.putString("projectFilterSkills",id);
editor.apply();
}
}
}
Пожалуйста, предложите, что я могу добавить, чтобы избавиться от сбоев и сохранить все функциональные возможности приложения.
PS: это код довольно старого приложения.