我的应用程序在线运行良好,但在离线时无法正常工作,这帮助了我



我想让我的应用程序脱机。当我将数据从 url 插入数据库时,当互联网可用时它可以正常工作,但是当没有互联网可用时,我的应用程序在 gridview 中没有显示任何内容,我的应用程序中出了什么问题,请帮助我为什么 gridview 不从数据库加载数据帮助我

               public class MainActivity extends Activity {
CategoryListAdapter3 cla;
static ArrayList<String> Category_ID = new ArrayList<String>();
static ArrayList<String> Category_name = new ArrayList<String>();
static ArrayList<String> Category_image = new ArrayList<String>();
String URL, URL2;
String SelectMenuAPI;
String _response;
String status;
GridView gridview;
private DbHelper mHelper;
private SQLiteDatabase dataBase;
private boolean isUpdate;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
       mHelper=new DbHelper(this);
        dataBase=mHelper.getWritableDatabase();

    gridview = (GridView) findViewById(R.id.gridview);
    cla = new CategoryListAdapter3(MainActivity.this);
    new TheTask().execute();
    gridview.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> arg0, View arg1,
                int position, long arg3) {
            // TODO Auto-generated method stub
            Intent iMenuList = new Intent(MainActivity.this,
                    Subcategory.class);
            iMenuList.putExtra("Category_ID", Category_ID.get(position));
            iMenuList.putExtra("Category_name", Category_name.get(position));
            startActivity(iMenuList);
        }
    });
}
void clearData() {
    Category_ID.clear();
    Category_name.clear();
    Category_image.clear();
}
public class TheTask extends AsyncTask<Void, String, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }
    @Override
    protected String doInBackground(Void... arg0) {
SelectMenuAPI = "http://www.fff/mobile_api.php?response=getmaincategories";
        clearData();
        URL = SelectMenuAPI;
        URL2 = URL.replace(" ", "%20");
        try {
            Log.i("url", "" + URL2);
            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet(URL2);
            HttpResponse response = client.execute(request);
            HttpEntity resEntity = response.getEntity();
            _response = EntityUtils.toString(resEntity);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return _response;
    }
    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        try {
            JSONObject json2 = new JSONObject(result);
            status = json2.getString("Status");
            if (status.equals("1")) {
                JSONArray school2 = json2.getJSONArray("data");
                //
                for (int i = 0; i < school2.length(); i++) {
                    JSONObject object = school2.getJSONObject(i);


                    String id = object.getString("category_id");
                    String name =object.getString("name");
                    String  image_path = object.getString("image_path");



                    dataBase=mHelper.getWritableDatabase();
                    ContentValues values=new ContentValues();
                    values.put(DbHelper.KEY_MYID,id);
                    values.put(DbHelper.KEY_FNAME,name);
                    values.put(DbHelper.KEY_LNAME,image_path );
                    System.out.println("");
                    if(isUpdate)
                    {    
                        //update database with new data 
                dataBase.update(DbHelper.TABLE_NAME, values, DbHelper.KEY_ID+"="+id, null);
                    }
                    else
                    {
                        //insert data into database
                        dataBase.insert(DbHelper.TABLE_NAME, null, values);
                    }
                    //close database
                    dataBase.close();

                }
            }
            else {


            }
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        displayData();

    }
}


private void displayData() {
    dataBase = mHelper.getWritableDatabase();
    Cursor mCursor = dataBase.rawQuery("SELECT * FROM "
            + DbHelper.TABLE_NAME, null);
 //
 //     Category_ID.clear();
 //     Category_name.clear();
 //     Category_image.clear();
    if (mCursor.moveToFirst()) {
        do {
   Category_ID.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_ID)));
    Category_name.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_FNAME)));
       Category_image.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_LNAME)));
        } while (mCursor.moveToNext());
    }
    gridview.setAdapter(cla);
    mCursor.close();
}


               public class DbHelper extends SQLiteOpenHelper {
static String DATABASE_NAME="userdata";
public static final String TABLE_NAME="user";
public static final String KEY_FNAME="fname";
public static final String KEY_LNAME="lname";
public static final String KEY_ID="id";
public static final String KEY_MYID="myid";

public DbHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_TABLE="CREATE TABLE "+TABLE_NAME+" ("+KEY_ID+" INTEGER PRIMARY  
             KEY,"+KEY_MYID+" TEXT, "+KEY_FNAME+" TEXT, "+KEY_LNAME+" BLOB)";
    db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);
    onCreate(db);
}
}





     public class CategoryListAdapter3 extends BaseAdapter {
private Activity activity;

private AQuery androidAQuery;

public CategoryListAdapter3(Activity act) {
    this.activity = act;
//  imageLoader = new ImageLoader(act);
}
public int getCount() {
    // TODO Auto-generated method stub
    return MainActivity.Category_ID.size();
}
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return position;
}
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    ViewHolder holder;
    androidAQuery = new AQuery(getcontext());
    if(convertView == null){
        LayoutInflater inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.viewitem2, null);
        holder = new ViewHolder();
        convertView.setTag(holder);
    }else{
        holder = (ViewHolder) convertView.getTag();
    }

    holder.txtText = (TextView) convertView.findViewById(R.id.title2);
    holder.imgThumb = (ImageView) convertView.findViewById(R.id.image2);
    holder.txtText.setText(MainActivity.Category_name.get(position));
        a 
   ndroidAQuery.id(holder.imgThumb).image(MainActivity.Category_image.get(position), true,  
     true);
    return convertView;
}
private Activity getcontext() {
    // TODO Auto-generated method stub
    return null;
}
static class ViewHolder {
    TextView txtText;
    ImageView imgThumb;
}

}

在网络服务调用之前检查互联网可用性:

public static boolean isInternetAvailable(Context context) {
    ConnectivityManager cm = (ConnectivityManager)  context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnectedOrConnecting()) {
      return true;
    }
    return false;
}

您只在 onPostExecute 中调用了 displayData(),因此仅当您从该 URL 接收数据时,数据才会显示在网格中。

解决方案:在 onCreate 函数中调用一次 displayData() 在 new TheTask().execute() 之前。因此,现在数据将从数据库显示(如果可用),然后使用 HTTPClient 从该 URL 获取。如果没有互联网,则仍会显示数据。

注意:确保在displayData()中光标大小大于0,否则不显示数据文本而不是网格视图。

快乐的编码:)

很明显,您实际上是在postExecute中称呼您displayData(),但是如果没有互联网,则会发生异常,您doInBackgroud并且null将被传递给postExecute...在postExecute再次异常,您的displayData()将不会被调用。

因此,首先,实施对空值的检查以避免异常,然后关闭尝试关闭 catch 块中的 db。

最新更新