如果E / JavaBinder可以做什么:!!!失败的粘合剂交易!错误来了?

时间:2018-05-19 20:27:36

标签: java android linkedhashmap android-bundle

我正在建立一个字典应用程序,其中我使用一个由100k字组成的现有数据库。现在问题是当我的应用程序在我的设备上运行时,它以启动活动开始,然后是另一个活动,其中我有一个编辑文本视图和一个用于搜索单词的搜索按钮。但是当我按下搜索按钮时,应用程序会挂起几秒钟,并且它不会移动到显示该单词和含义的另一个活动。这是我的代码:

这是我的homeActivity.java,在启动画面后打开。

 package index1.developer.acadview.com.dictionaryapp;
 import android.content.Intent;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.support.v7.app.AppCompatActivity;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.Button; 
 import android.widget.EditText;

 import java.io.Serializable;
 import java.util.ArrayList;  
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.Map;


 public class homeActivity extends AppCompatActivity {

public static ArrayList<DictObjectModel> data;
EditText et;
Button b1;
DatabaseHelper db;
ArrayList<String> wordcombimelist;
ArrayList<String> meancombimelist;
LinkedHashMap<String, String> namelist;

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

    db = new DatabaseHelper(this);
  et=(EditText) findViewById(R.id.et1);
  b1=(Button)findViewById(R.id.but1);

  data = new ArrayList<DictObjectModel>();
  fetchData();

  b1.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
          String st=et.getText().toString();
          Intent go= new Intent(homeActivity.this, wordDisplay.class);
          Bundle args = new Bundle();
          args.putSerializable("meaningdata", (Serializable) data);
          go.putExtra("wd",st);
          go.putExtra("BUNDLE",args);
          startActivity(go);
      }
  });
}


public void fetchData() {
    db = new DatabaseHelper(this);
    try {

        db.createDataBase();
        db.openDataBase();

    } catch (Exception e) {
        e.printStackTrace();
    }


    namelist = new LinkedHashMap<>();
    int ii;
    SQLiteDatabase sd = db.getReadableDatabase();
    Cursor cursor = sd.query("Dictionary1", null, null, null, null, null, null);
    ii = cursor.getColumnIndex("word");
    wordcombimelist = new ArrayList<String>();
    meancombimelist = new ArrayList<String>();
    while (cursor.moveToNext()) {
        namelist.put(cursor.getString(ii), cursor.getString(cursor.getColumnIndex("definition")));
    }
    Iterator entries = namelist.entrySet().iterator();
    while(entries.hasNext()) {
        Map.Entry thisEntry = (Map.Entry) entries.next();
        wordcombimelist.add(String.valueOf(thisEntry.getKey()));
        meancombimelist.add("- " + String.valueOf(thisEntry.getValue()));
    }

    for (int i = 0; i < wordcombimelist.size(); i++) {
        data.add(new DictObjectModel(wordcombimelist.get(i), meancombimelist.get(i)));
    }
}

}

这是我的另一个活动,我希望显示从数据库中获取的单词和含义,以显示为文本切换器wordDisplay.java:

 package index1.developer.acadview.com.dictionaryapp;

 import android.content.Intent;
 import android.graphics.Color;
 import android.support.v7.app.AppCompatActivity;
 import android.os.Bundle;
 import android.view.Gravity;
 import android.view.View;
 import android.view.animation.Animation;
 import android.view.animation.AnimationUtils;
 import android.widget.ImageButton;
 import android.widget.TextSwitcher;
 import android.widget.TextView;
 import android.widget.ViewSwitcher;
 import java.util.ArrayList;


public class wordDisplay extends AppCompatActivity {

private TextSwitcher tx;
ArrayList<DictObjectModel> dataset;
ImageButton right;
ImageButton left;

int j = 1;
 int currentindex;
long messageCount;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_word_display);
    dataset = new ArrayList<>();
    Intent intent = getIntent();
    Bundle bundle= intent.getBundleExtra("BUNDLE");
    dataset= (ArrayList<DictObjectModel>) 
    bundle.getSerializable("meaningdata");
    Bundle b = intent.getExtras();

    messageCount = dataset.size();

    tx = (TextSwitcher) findViewById(R.id.textSwitcher);
    right = (ImageButton) findViewById(R.id.rightbut);
    left = (ImageButton) findViewById(R.id.leftbut);
    tx.setFactory(new ViewSwitcher.ViewFactory() {
        @Override
        public View makeView() {
            TextView textdis = new TextView(wordDisplay.this);
            textdis.setGravity(Gravity.TOP | Gravity.CENTER_VERTICAL);
            textdis.setTextSize(24);
            textdis.setTextColor(Color.BLUE);
            return textdis;
        }
    });
    Animation in = AnimationUtils.loadAnimation(this, 
    android.R.anim.slide_in_left);
    Animation out = AnimationUtils.loadAnimation(this,  
    android.R.anim.slide_out_right);

    tx.setAnimation(in);
    tx.setAnimation(out);
    final String i = b.getString("wd");
    currentindex = j;

    tx.setText(dataset.get(currentindex).getWord());

    /* while (currentindex < messageCount) {
        if (i.equalsIgnoreCase(dataset.get(currentindex).getWord())) {
            tx.setText((CharSequence) dataset.get(currentindex).getWord());
            break;
        }
        currentindex++;

       }
       * */
      }
   }
    /*left.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            currentindex--;
            if (currentindex == -1) {
                currentindex = 0;
                Toast.makeText(wordDisplay.this, "Reached the first word", 
                 Toast.LENGTH_SHORT).show();
            }
            tx.setText((CharSequence) dataset.get(currentindex).getWord());
            tx.setText((CharSequence) 
            dataset.get(currentindex).getMeaning());
          }
       });
        right.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            currentindex++;
            if (currentindex == messageCount)
                currentindex = 0;

            tx.setText((CharSequence) dataset.get(currentindex).getWord());
            tx.setText((CharSequence) 
        dataset.get(currentindex).getMeaning());
        }
    });
    * */

我的databaseHelper.java:

    package index1.developer.acadview.com.dictionaryapp;

    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteException;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.util.Log;
    import android.widget.Button;

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.sql.SQLException;



   public class DatabaseHelper extends SQLiteOpenHelper{

//The Android's default system path of your application database.
private static String DB_PATH = "";

private static String DB_NAME = "dictionary.db";

private SQLiteDatabase myDataBase;

private final Context myContext;

  /**
   * Constructor
  * Takes and keeps a reference of the passed context in order to access to 
  the application assets and resources.
  * @param context
    */
    public DatabaseHelper(Context context) {

    super(context, DB_NAME, null, 1);
    this.myContext = context;
    DB_PATH= myContext.getDatabasePath(DB_NAME).toString();
 }

/**
 * Creates a empty database on the system and rewrites it with your own 
database.
 * */
public void createDataBase() throws IOException{

    boolean dbExist = checkDataBase();

    if(dbExist){
        //do nothing - database already exist
    }else{

        //By calling this method and empty database will be created into the 
        default system path
        //of your application so we are gonna be able to overwrite that 
        database with our database.
        this.getWritableDatabase();
        this.close();

        try {

            copyDataBase();

        } catch (IOException e) {

            throw new Error("Error copying database");

        }

    }

}

/**
 * Check if the database already exist to avoid re-copying the file each 
   time you open the application.
 * @return true if it exists, false if it doesn't
 */
private boolean checkDataBase(){
    //  this.getReadableDatabase();

    SQLiteDatabase checkDB = null;

    try{
        String myPath = DB_PATH ;
        checkDB = SQLiteDatabase.openDatabase(myPath, null, 
        SQLiteDatabase.OPEN_READONLY);

    }catch(SQLiteException e){

        //database does't exist yet.

    }

    if(checkDB != null){

        checkDB.close();

    }

    return checkDB != null ? true : false;
}

/**
 * Copies your database from your local assets-folder to the just created 
    empty database in the
 * system folder, from where it can be accessed and handled.
 * This is done by transfering bytestream.
 * */
private void copyDataBase() throws IOException{

    //Open your local db as the input stream
    InputStream myInput = myContext.getAssets().open(DB_NAME);

    // Path to the just created empty db
    String outFileName = DB_PATH ;

    //Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    //transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer))>0){
        myOutput.write(buffer, 0, length);
    }

    //Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();

}

public void openDataBase() throws SQLException{

    //Open the database
    String myPath = DB_PATH ;
    myDataBase = SQLiteDatabase.openDatabase(myPath, null, 
    SQLiteDatabase.OPEN_READONLY);

}

@Override
public synchronized void close() {

    if(myDataBase != null)
        myDataBase.close();

    super.close();

}

@Override
public void onCreate(SQLiteDatabase db) {

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

  // Add your public helper methods to access and get content from the 
   database.
  // You could return cursors by doing "return myDataBase.query(....)" so 
  it'd be easy
  // to you to create adapters for your views.


  //add your public methods for insert, get, delete and update data in 
  database.

}

最后是对象模型类:

     package index1.developer.acadview.com.dictionaryapp;


    import java.io.Serializable;

     public class DictObjectModel implements Serializable {

    String word, meaning;

    public DictObjectModel(String word, String meaning){

        this.word=word;
        this.meaning = meaning;


    }
    public  String getWord()
    {
        return word;
    }

    public  String getMeaning()
    {
        return meaning;
        }

   }

请有人帮帮我。

0 个答案:

没有答案