2015-05-14 86 views
0

即時製作一個應用程序使用json的第一個活動,但是當應用程序打開沒有互聯網conection該應用程序使「逼近」,我不知道該怎麼做才能卵形這個錯誤,幫助, IM在Android和Java的新應用程序強制關閉沒有互聯網JSON

公共類MainActivity擴展ActionBarActivity {

String TITLES[] = {"Que es CMX","Ejecutivos(as)","Nuestros Servicios","Soluciones a tu Medida","Certificaciones Vigentes", "Cursos Online", "", "", "", ""}; 

int ICONS[] = {R.mipmap.organization,R.mipmap.conference,R.mipmap.services,R.mipmap.approval,R.mipmap.diploma1,R.mipmap.donate,R.id.linea,R.id.linea,R.id.linea,R.mipmap.home}; 

String NAME = "John Doe"; 
String EMAIL = "[email protected].mx"; 
int PROFILE = R.drawable.profile1; 

private Toolbar toolbar;        // Declaring the Toolbar Object 

RecyclerView mRecyclerView;       // Declaring RecyclerView 
RecyclerView.Adapter mAdapter;      // Declaring Adapter For Recycler View 
RecyclerView.LayoutManager mLayoutManager;   // Declaring Layout Manager as a linear layout manager 
DrawerLayout Drawer;         // Declaring DrawerLayout 

ActionBarDrawerToggle mDrawerToggle;     // Declaring Action Bar Drawer Toggle 
// Declare Variables 
JSONObject jsonobject; 
JSONArray jsonarray; 
ListView listview; 
ListViewAdapter adapter; 
ProgressDialog mProgressDialog; 
ArrayList<HashMap<String, String>> arraylist; 
static String RANK = "title"; 
static String COUNTRY = "place"; 
static String POPULATION = "date"; 
static String CONTENT1 = "content1"; 
static String CONTENT2 = "content2"; 
static String FLAG = "imagen"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // Get the view from listview_main.xml 
    setContentView(R.layout.listview_main); 
    // Execute DownloadJSON AsyncTask 
    new DownloadJSON().execute(); 

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

    setTitle(R.string.title_activity_main); 



    mRecyclerView = (RecyclerView) findViewById(R.id.RecyclerView); // Assigning the RecyclerView Object to the xml View 

    mRecyclerView.setHasFixedSize(true);       // Letting the system know that the list objects are of fixed size 

    mAdapter = new MyAdapter(TITLES,ICONS,NAME,EMAIL,PROFILE,this);  // Creating the Adapter of MyAdapter class(which we are going to see in a bit) 
    // And passing the titles,icons,header view name, header view email, 
    // and header view profile picture 

    mRecyclerView.setAdapter(mAdapter);        // Setting the adapter to RecyclerView 

    final GestureDetector mGestureDetector = new GestureDetector(MainActivity.this, new GestureDetector.SimpleOnGestureListener() { 

     @Override public boolean onSingleTapUp(MotionEvent e) { 
      return true; 
     } 

    }); 


    mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { 
     @Override 
     public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) { 
      View child = recyclerView.findChildViewUnder(motionEvent.getX(),motionEvent.getY()); 



      if(child !=null && mGestureDetector.onTouchEvent(motionEvent)){ 
       Drawer.closeDrawers(); 

       if (recyclerView.getChildPosition(child) == 0) { 
        Intent intent = new Intent(MainActivity.this, Profile.class); 
        startActivity(intent); 
        finish(); 
       }else if 
         (recyclerView.getChildPosition(child) == 1) { 
        Intent intent = new Intent(MainActivity.this, CMX.class); 
        startActivity(intent); 
        finish(); 
       }else if 
         (recyclerView.getChildPosition(child) == 2) { 
        Intent intent = new Intent(MainActivity.this, Ejecutivos.class); 
        startActivity(intent); 
        finish(); 
       }else if 
         (recyclerView.getChildPosition(child) == 3){ 
        Intent intent = new Intent(MainActivity.this, Servicios.class); 
        startActivity(intent); 
        finish(); 
       }else if 
         (recyclerView.getChildPosition(child) == 4){ 
        Intent intent = new Intent(MainActivity.this, Soluciones.class); 
        startActivity(intent); 
        finish(); 
       }else if 
         (recyclerView.getChildPosition(child) == 5) { 
        Intent intent = new Intent(MainActivity.this, Certificaciones.class); 
        startActivity(intent); 
        finish(); 
       }else if 
         (recyclerView.getChildPosition(child) == 6){ 
        Intent intent = new Intent(MainActivity.this, Web.class); 
        startActivity(intent); 
        finish(); 
       }else if 
         (recyclerView.getChildPosition(child) == 8){ 
        Intent intent = new Intent(MainActivity.this, MainActivity.class); 
        startActivity(intent); 
        finish(); 
       } 

       return true; 

      } 

      return false; 
     } 

     @Override 
     public void onTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) { 

     } 
    }); 


    mLayoutManager = new LinearLayoutManager(this);     // Creating a layout Manager 

    mRecyclerView.setLayoutManager(mLayoutManager);     // Setting the layout Manager 


    Drawer = (DrawerLayout) findViewById(R.id.DrawerLayout);  // Drawer object Assigned to the view 
    mDrawerToggle = new ActionBarDrawerToggle(this,Drawer,toolbar,R.string.openDrawer,R.string.closeDrawer){ 

     @Override 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
      // code here will execute once the drawer is opened(As I dont want anything happened whe drawer is 
      // open I am not going to put anything here) 
     } 

     @Override 
     public void onDrawerClosed(View drawerView) { 
      super.onDrawerClosed(drawerView); 
      // Code here will execute once drawer is closed 
     } 



    }; // Drawer Toggle Object Made 
    Drawer.setDrawerListener(mDrawerToggle); // Drawer Listener set to the Drawer toggle 
    mDrawerToggle.syncState();    // Finally we set the drawer toggle sync State 
} 

// DownloadJSON AsyncTask 
private class DownloadJSON extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     // Create a progressdialog 
     mProgressDialog = new ProgressDialog(MainActivity.this); 
     // Set progressdialog message 
     mProgressDialog.setMessage("Cargando..."); 
     mProgressDialog.setIndeterminate(false); 
     // Show progressdialog 
     mProgressDialog.show(); 
    } 


    @Override 
    protected Void doInBackground(Void... params) { 
     // Create an array 
     arraylist = new ArrayList<HashMap<String, String>>(); 
     // Retrieve JSON Objects from the given URL address 
     jsonobject = JSONfunctions.getJSONfromURL("http://cmx.org.mx/wp-content/uploads/json.txt"); 

     try { 
      // Locate the array name in JSON 
      jsonarray = jsonobject.getJSONArray("posts"); 

      for (int i = 0; i < jsonarray.length(); i++) { 
       HashMap<String, String> map = new HashMap<String, String>(); 
       jsonobject = jsonarray.getJSONObject(i); 
       // Retrive JSON Objects 
       map.put("title", jsonobject.getString("title")); 
       map.put("place", jsonobject.getString("place")); 
       map.put("date", jsonobject.getString("date")); 
       map.put("content1", jsonobject.getString("content1")); 
       map.put("content2", jsonobject.getString("content2")); 
       map.put("imagen", jsonobject.getString("imagen")); 
       // Set the JSON Objects into the array 
       arraylist.add(map); 
      } 
     } catch (JSONException e) { 
      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void args) { 
     // Locate the listview in listview_main.xml 
     listview = (ListView) findViewById(R.id.listview); 
     // Pass the results into ListViewAdapter.java 
     adapter = new ListViewAdapter(MainActivity.this, arraylist); 
     // Set the adapter to the ListView 
     listview.setAdapter(adapter); 
     // Close the progressdialog 
     mProgressDialog.dismiss(); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

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(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    if (mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 

    switch (item.getItemId()) { 
     // Respond to the action bar's Up/Home button 
     case R.id.about: 

      Intent intent = new Intent(MainActivity.this, About.class); 
      startActivity(intent); 

      return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

}

public class JSONfunctions { 

    public static JSONObject getJSONfromURL(String url) { 
     InputStream is = null; 
     String result = ""; 
     JSONObject jArray = null; 

     // Download JSON data from URL 
     try { 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(url); 
      HttpResponse response = httpclient.execute(httppost); 
      HttpEntity entity = response.getEntity(); 
      is = entity.getContent(); 

     } catch (Exception e) { 
      Log.e("log_tag", "Error in http connection " + e.toString()); 
     } 

     // Convert response to string 
     try { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
        is, "iso-8859-1"), 8); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      is.close(); 
      result = sb.toString(); 
     } catch (Exception e) { 
      Log.e("log_tag", "Error converting result " + e.toString()); 
     } 

     try { 

      jArray = new JSONObject(result); 
     } catch (JSONException e) { 
      Log.e("log_tag", "Error parsing data " + e.toString()); 
     } 

     return jArray; 
    } 
} 

- 編輯

的logcat: https://goo.gl/N1YQ9T

UPDATE1:

 @Override 
    protected Void doInBackground(Void... params) { 
     // Create an array 
     arraylist = new ArrayList<HashMap<String, String>>(); 
     // Retrieve JSON Objects from the given URL address 
     jsonobject = JSONfunctions.getJSONfromURL("http://cmx.org.mx/wp-content/uploads/json.txt"); 

    if(jsonobject==null){ 
     Toast.makeText(getApplicationContext(), "No Internet", Toast.LENGTH_LONG).show(); 
    }else{ 

     try { 
      // Locate the array name in JSON 
      jsonarray = jsonobject.getJSONArray("posts"); 

      for (int i = 0; i < jsonarray.length(); i++) { 
       HashMap<String, String> map = new HashMap<String, String>(); 
       jsonobject = jsonarray.getJSONObject(i); 
       // Retrive JSON Objects 
       map.put("title", jsonobject.getString("title")); 
       map.put("place", jsonobject.getString("place")); 
       map.put("date", jsonobject.getString("date")); 
       map.put("content1", jsonobject.getString("content1")); 
       map.put("content2", jsonobject.getString("content2")); 
       map.put("imagen", jsonobject.getString("imagen")); 
       // Set the JSON Objects into the array 
       arraylist.add(map); 
      } 
     } catch (JSONException e) { 
      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 
     return null; 
    } 

MyAdapter:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 

private static final int TYPE_HEADER = 0; // Declaring Variable to Understand which View is being worked on 
// IF the view under inflation and population is header or Item 
private static final int TYPE_ITEM = 1; 

private String mNavTitles[]; // String Array to store the passed titles Value from MainActivity.java 
private int mIcons[];  // Int Array to store the passed icons resource value from MainActivity.java 

private String name;  //String Resource for header View Name 
private int profile;  //int Resource for header view profile picture 
private String email;  //String Resource for header view email 
Context context; 


// Creating a ViewHolder which extends the RecyclerView View Holder 
// ViewHolder are used to to store the inflated views in order to recycle them 

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
    int Holderid; 

    TextView textView; 
    ImageView imageView; 
    ImageView profile; 
    TextView Name; 
    TextView email; 
    Context contxt; 


    public ViewHolder(View itemView,int ViewType,Context c) {     // Creating ViewHolder Constructor with View and viewType As a parameter 
     super(itemView); 
     contxt = c; 
     itemView.setClickable(true); 
     itemView.setOnClickListener(this); 


     // Here we set the appropriate view in accordance with the the view type as passed when the holder object is created 

     if(ViewType == TYPE_ITEM) { 
      textView = (TextView) itemView.findViewById(R.id.rowText); // Creating TextView object with the id of textView from item_row.xml 
      imageView = (ImageView) itemView.findViewById(R.id.rowIcon);// Creating ImageView object with the id of ImageView from item_row.xml 
      Holderid = 1;            // setting holder id as 1 as the object being populated are of type item row 
     } 
     else{ 


      Name = (TextView) itemView.findViewById(R.id.name);   // Creating Text View object from header.xml for name 
      email = (TextView) itemView.findViewById(R.id.email);  // Creating Text View object from header.xml for email 
      profile = (ImageView) itemView.findViewById(R.id.circleView);// Creating Image view object from header.xml for profile pic 
      Holderid = 0;            // Setting holder id = 0 as the object being populated are of type header view 
     } 
    } 

    @Override 
    public void onClick(View v) { 

     Toast.makeText(contxt, "The Item Clicked is: " + getPosition(), Toast.LENGTH_SHORT).show(); 

    } 

    } 



MyAdapter(String Titles[],int Icons[],String Name,String Email, int Profile, Context passedContext){ // MyAdapter Constructor with titles and icons parameter 
    // titles, icons, name, email, profile pic are passed from the main activity as we 
     mNavTitles = Titles;    //have seen earlier 
    mIcons = Icons; 
    name = Name; 
    email = Email; 
    profile = Profile; 
    this.context = passedContext; //here we assign those passed values to the values we declared here 
    //in adapter 

} 



//Below first we ovverride the method onCreateViewHolder which is called when the ViewHolder is 
//Created, In this method we inflate the item_row.xml layout if the viewType is Type_ITEM or else we inflate header.xml 
// if the viewType is TYPE_HEADER 
// and pass it to the view holder 

@Override 
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    if (viewType == TYPE_ITEM) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_row,parent,false); //Inflating the layout 

     ViewHolder vhItem = new ViewHolder(v,viewType,context); //Creating ViewHolder and passing the object of type view 

     return vhItem; // Returning the created object 

     //inflate your layout and pass it to view holder 

    } else if (viewType == TYPE_HEADER) { 

     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.header,parent,false); //Inflating the layout 

     ViewHolder vhHeader = new ViewHolder(v,viewType,context); //Creating ViewHolder and passing the object of type view 

     return vhHeader; //returning the object created 


    } 
    return null; 

} 

//Next we override a method which is called when the item in a row is needed to be displayed, here the int position 
// Tells us item at which position is being constructed to be displayed and the holder id of the holder object tell us 
// which view type is being created 1 for item row 
@Override 
public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) { 
    if(holder.Holderid ==1) {        // as the list view is going to be called after the header view so we decrement the 
     // position by 1 and pass it to the holder while setting the text and image 
     holder.textView.setText(mNavTitles[position - 1]); // Setting the Text with the array of our Titles 
     holder.imageView.setImageResource(mIcons[position -1]);// Settimg the image with array of our icons 
    } 
    else{ 

     holder.profile.setImageResource(profile);   // Similarly we set the resources for header view 
     holder.Name.setText(name); 
     holder.email.setText(email); 
    } 
} 

// This method returns the number of items present in the list 
@Override 
public int getItemCount() { 
    return mNavTitles.length+1; // the number of items in the list will be +1 the titles including the header view. 
} 


// Witht the following method we check what type of view is being passed 
@Override 
public int getItemViewType(int position) { 
    if (isPositionHeader(position)) 
     return TYPE_HEADER; 

    return TYPE_ITEM; 
} 

private boolean isPositionHeader(int position) { 
    return position == 0; 
} 
+0

發佈您的LogCat。 –

+0

可能有1000個關閉力量的原因。請張貼適當的錯誤logcat。 – theJango

回答

0

你的方法getJSONfromURL()捕獲所有我能想到的例外,所以這個問題可能是不存在的。

問題是當異常被捕獲時它返回null

因此,jsonobject在您沒有互聯網時爲空,然後您正在訪問它,就好像它不是空的jsonobject.getJSONArray("posts")

我建議你檢查是否jsonobject == null只是jsonobject = JSONfunctions.getJSONfromURL(...);

編輯(以下注釋)的行之後:

該錯誤可能是由於在MainActivity這行代碼。 int ICONS[] = {R.mipmap.organization,R.mipmap.conference,R.mipmap.services,R.mipmap.approval,R.mipmap.diploma1,R.mipmap.donate,R.id.linea,R.id.linea,R.id.linea,R.mipmap.home};

ICONS數組中的所有項應該是R.mipmap.xxxx或R.drawable.xxxx,而不是R.id.xxxx或其他。若要查看是否存在此問題,請將所有R.id.linea替換爲R.mipmap.conference作爲測試目的,並讓我們知道接下來會發生什麼。

+0

Someting like this?(update1) – GusDev

+0

是的,這就是我的意思。你的應用程序仍然崩潰? – Karim

+0

是的,仍然崩潰 – GusDev

0
@Override 
protected Void doInBackground(Void... params) { 
    // Create an array 
    arraylist = new ArrayList<HashMap<String, String>>(); 
    // Retrieve JSON Objects from the given URL address 
    jsonobject = JSONfunctions.getJSONfromURL("http://cmx.org.mx/wp-content/uploads/json.txt"); 

    if(jsonobject==null){ 
     Intent intent = new Intent(MainActivity.this, CMX.class); 
     startActivity(intent); 
     finish(); 
}else{ 

    try { 
     // Locate the array name in JSON 
     jsonarray = jsonobject.getJSONArray("posts");