2014-11-05 117 views
-3

ive在sqlite数据库中存储了一些图像名称。我的代码应该检索所有图像名称并将其存储在数组中,然后根据其名称将第一个图像分配给imageview。使用UIL将图像设置为图像视图。从sqlite数据库中检索数据时出现NullPointerException

我的代码

public class Locker extends Activity { 
int index = 0, limit, tolerance = 40, state = 1; 
String[] bgimg; 
String[] ranimg; 
int[] ActXCod; 
int[] ActYCod; 
ImageView image; 
ImageLoader imageloader; 
File Path; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.locker); 
    image = (ImageView) findViewById(R.id.imageView1); 
    SharedPreferences getprefs = PreferenceManager 
      .getDefaultSharedPreferences(getBaseContext()); 
    String temp = getprefs.getString("ImageSeqNo", "4"); 
    limit = Integer.parseInt(temp); 
    Path = getExternalFilesDir(null); 
    Constants cons = new Constants(); 
    ranimg = cons.getImagePath(Path.toString()); 
    imageloader = ImageLoader.getInstance(); 
    try { 
     new Thread(new getData()).start(); 

     imageloader.displayImage("file://" + Path.toString() + "/" 
       + bgimg[index], image); 
    } catch (Exception e) { 
     String error = e.toString(); 
     Dialog d = new Dialog(this); 
     d.setTitle("ERROR"); 
     TextView tv = new TextView(this); 
     tv.setText(error); 
     d.setContentView(tv); 
     d.show(); 
    } 

} 

public boolean onTouchEvent(MotionEvent event) { 
    // MotionEvent object holds X-Y values 
    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     int XCood = (int) event.getX(); 
     int YCood = (int) event.getY(); 
     int XMin = ActXCod[index] - tolerance, XMax = ActXCod[index] 
       + tolerance, YMin = ActYCod[index] - tolerance, YMax = ActYCod[index] 
       + tolerance; 

     /* 
     * String text = "You clicked at x = " + XCood + " and y = " + 
     * YCood; final Toast toast = Toast.makeText(this, text, 
     * Toast.LENGTH_SHORT); toast.show(); Handler handler = new 
     * Handler(); handler.postDelayed(new Runnable() { 
     * 
     * @Override public void run() { toast.cancel(); } }, 750); 
     */ 

     if (index < (limit - 1)) // loop to check number of images 
     { 
      // loop to check status 
      if ((state == 1) 
        && (((XCood > XMin) && (XCood < XMax)) && ((YCood > YMin) && (YCood < YMax)))) { 
       index++; 
       imageloader.displayImage("file://" + Path.toString() + "/" 
         + bgimg[index], image); 
      } else { 
       index++; 
       Random r = new Random(); 
       int ran = r.nextInt(10 - 0); 
       imageloader.displayImage("file://" + ranimg[ran], image); 
       state = 0; 
      } 
     } else { 
      if (state == 1) { 
       Intent i = new Intent(Locker.this, Compare_Pattern.class); 
       startActivity(i); 
       finish(); 
      } else { 
       new AlertDialog.Builder(this) 
         .setTitle("Failed Login Attempt") 
         .setMessage(
           "Your previous login attempt has failed.Would you like to try again?") 
         .setPositiveButton(android.R.string.yes, 
           new DialogInterface.OnClickListener() { 
            public void onClick(
              DialogInterface dialog, 
              int which) { 
             // continue with delete 
             Intent intent = getIntent(); 

             startActivity(intent); 
             finish(); 
            } 
           }) 
         .setNegativeButton(android.R.string.no, 
           new DialogInterface.OnClickListener() { 
            public void onClick(
              DialogInterface dialog, 
              int which) { 
             // do nothing 
             finish(); 
            } 
           }).show(); 
      } 
     } 

    } 

    return super.onTouchEvent(event); 
} 

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

class getData implements Runnable { 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     DataBaseHandler handler = new DataBaseHandler(
       getApplicationContext()); 
     handler.open(); 
     ActXCod = handler.getXcod(); 
     ActYCod = handler.getYcod(); 
     bgimg = handler.getImg(); 
     handler.close(); 

    } 

} 

} 

我试图调试代码和它给了我一个显示java.lang.NullPointerExceptionbgimg[index]在该行imageloader.displayImage("file://" + Path.toString() + "/" + bgimg[index], image);。我无法弄清楚为什么。任何帮助都被感激地接受。

+2

把你的完整代码 – 2014-11-05 12:29:13

+0

@moradiyaAkash我已更新我的文章 – 2014-11-05 12:31:11

回答

-1
new Thread(new getData()).start(); 
imageloader.displayImage("file://" + Path.toString() + "/" 
      + bgimg[index], image); 

bgimg尚未初始化。即使你开始你的线程,它也不会立即运行,并且立即执行bgimg的初始化。

将需要线程代码结果的代码移入线程本身。您可以使用Activity.runOnUiThread()将执行从后台线程移回UI线程。

+0

谢谢@laalto它工作:) – 2014-11-05 14:07:54