Страница 1 из 1

Проблема с ArrayIndexOutOfBoundsException

Добавлено: 22 май 2015, 12:10
Alibard
Из БД достаю Линки на изображения, но почемуто 2 последних. Вивиожу их в своей фото голиреи. Но последние 2 картинки не хотят виводитса в полньій екран.
Вот код

Код: Выделить всё

package com.example.bomba;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

import com.squareup.picasso.Picasso;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;

public class Galery extends Activity{
	ImageView qq;
	Picasso pic;
	static ImageAapter adapter;

	private Context context;	
		public static final String[] imagesUrls = {
			"http://bomba.vn.ua/sites/default/files/styles/200x200/public/_dsc0072.jpg?itok=ORAFJotr",
			"http://bomba.vn.ua/sites/default/files/styles/200x200/public/_dsc0104.jpg?itok=Peitxl1w",
			
		};
		
		final String LOG_TAG = "myLogs";
		ListView mLvImages;
		ImageView img;
		Button btn;
		 String[] str = null;
		@Override
		protected void onCreate(Bundle savedInstanceState) {
			super.onCreate(savedInstanceState);
			setContentView(R.layout.galery);
		    mLvImages = (ListView) findViewById(R.id.lvImages);
		    img =(ImageView)findViewById(R.id.bigimg);
		    img.setVisibility(View.INVISIBLE);
		    adapter =null;
		   
		    Intent intent = getIntent();
			 String dbqeru = intent.getStringExtra("dbqeru");
			 MyTask mt = new MyTask();
		     mt.execute();
		   
		 
		   try {
				 str= mt.get();
			//	 Log.d(LOG_TAG, str[0]); 
				 run();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ExecutionException e) {
				// TODO Auto-generated catch block
			}
		    
			
			 
			 mLvImages.setOnItemClickListener(new OnItemClickListener() {
			   

				@Override
				public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
					img.setVisibility(View.VISIBLE);
					mLvImages.setVisibility(View.INVISIBLE);
					pic.with(context).load(str[position]).into(img);
				
					 Log.d(LOG_TAG, "itemClick: position = " + position + ", id = "
					            + id);
					 Log.d(LOG_TAG, imagesUrls[position]); 
					}
			 });
			 img.setOnClickListener(new OnClickListener() {
					@Override
					public void onClick(View v) {
						img.setVisibility(View.INVISIBLE);
						mLvImages.setVisibility(View.VISIBLE);
					}
				});
			
		}
public void run(){
	 if (str != null) {
		 ImageAapter adapter = new ImageAapter(this, str);
	      mLvImages.setAdapter(adapter);
	      //Log.d(LOG_TAG, Integer.toString(str.length));
	      Log.d(LOG_TAG, str[2]);
	      Log.d(LOG_TAG, str[3]);
	      }
}

	class ImageAapter extends ArrayAdapter<String> {

	    LayoutInflater mInflater;
	    Picasso mPicasso;
	    
	    public ImageAapter(Context context, String[] imagesurls) {
	    	super(context, R.layout.list_item, imagesurls);
		      mInflater = LayoutInflater.from(context); 
		      mPicasso = Picasso.with(context);
		    }
	    @Override
	    public View getView(int position, View convertView, ViewGroup parent) {
	      View view = convertView;
	      if (view == null) {
	        view = mInflater.inflate(R.layout.list_item, parent, false);
	      }
	      ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
	      mPicasso.load(getItem(position)).resizeDimen(R.dimen.image_size, R.dimen.image_size). centerInside().into(imageView);
	      return view;
	      
	    }
	   
	}

	}
class MyTask extends AsyncTask<String, String, String[]> {
	 final String LOG_TAG = "myLogs";
	 int i=0;
	 private String[] photo_arr = null;
	
	 String[] fff = {"http://bomba.vn.ua/sites/default/files/_dsc0104.jpg",
			 "http://bomba.vn.ua/sites/default/files/_dsc0104.jpg" +
			 "","http://bomba.vn.ua/sites/default/files/_dsc0104.jpg"};
 @Override
 protected void onPreExecute() {
   super.onPreExecute();
  
 }

 protected String[] doInBackground(String... params) {
	try {    
         Class.forName("com.mysql.jdbc.Driver"); 
         Log.d(LOG_TAG, "--- Driver is conected!!! ---"); 
     } catch (ClassNotFoundException e) { 
         Log.d(LOG_TAG, "--- Driver is NOT conected!!! ---"); 
         Log.d(LOG_TAG,e.toString()); 
         e.printStackTrace(); 
         return  null; 
     } 
     Connection conn = null; 
     
     String url1 = "jdbc:mysql://sql5.freesqldatabase.com:3306/sql578111"; 
     String name = "******"; 
     String password = "*******"; 
     int i=0;
     String ss;
     String qury="SELECT smal, id FROM photo_travhol";
     
     	try { 
     		conn = DriverManager.getConnection(url1, name, password); 
     
     		Statement stmt = conn.createStatement();
     		ResultSet rs = stmt.executeQuery(qury);
         
     		Log.d(LOG_TAG,"есть подключение к БД");    
     		rs.last();
     		int qwe = rs.getInt("id");
     		rs.first();
     		rs.beforeFirst();
     		photo_arr = new String[qwe];
     			while (rs.next()) {
     				String lastName = rs.getString("smal");
     				photo_arr[i]=lastName;
     				i++;
     			//	downloadFile(lastName);
        	
     			}
     		Log.d(LOG_TAG,"есть подключение к БД"); 
        
     	} catch (java.sql.SQLException e) { 
          
        Log.d(LOG_TAG,e.toString()); 
        Log.d(LOG_TAG,"ошибка подключения к БД");
     } 

     if (conn == null) { 
       	 Log.d(LOG_TAG,"нет данных БД");
     } else { 
     	 Log.d(LOG_TAG,"есть данные!");
     } 
     return photo_arr;
 }
 
 	private void downloadFile(String url){
 	//	photo_arr[i]=url;
	 //	i++;
	 //	Log.d(LOG_TAG, "Update. Result = " + photo_arr[i]);
 	}
 
 
 	protected void onProgressUpdate(String values) {
 		super.onProgressUpdate(values);
    }
 
 
 	protected void onPostExecute(String[] result) {
 		super.onPostExecute(result);
 		Log.d(LOG_TAG, "End. Result = " + result);
 	}
}
Когда пьітаюсь открить на весь екран последние 2 картинки вьілетает вот такие логи

Код: Выделить всё

05-22 11:59:20.261: W/dalvikvm(4285): threadid=1: thread exiting with uncaught exception (group=0x40a84228)
05-22 11:59:20.271: E/AndroidRuntime(4285): FATAL EXCEPTION: main
05-22 11:59:20.271: E/AndroidRuntime(4285): java.lang.ArrayIndexOutOfBoundsException: length=2; index=-1
05-22 11:59:20.271: E/AndroidRuntime(4285): 	at com.example.bomba.Galery$1.onItemClick(Galery.java:87)
05-22 11:59:20.271: E/AndroidRuntime(4285): 	at android.widget.AdapterView.performItemClick(AdapterView.java:292)
05-22 11:59:20.271: E/AndroidRuntime(4285): 	at android.widget.AbsListView.performItemClick(AbsListView.java:1099)
05-22 11:59:20.271: E/AndroidRuntime(4285): 	at android.widget.ListView.performItemClick(ListView.java:4758)
05-22 11:59:20.271: E/AndroidRuntime(4285): 	at android.widget.AbsListView$PerformClick.run(AbsListView.java:2556)
05-22 11:59:20.271: E/AndroidRuntime(4285): 	at android.widget.AbsListView$1.run(AbsListView.java:3223)
05-22 11:59:20.271: E/AndroidRuntime(4285): 	at android.os.Handler.handleCallback(Handler.java:608)
05-22 11:59:20.271: E/AndroidRuntime(4285): 	at android.os.Handler.dispatchMessage(Handler.java:92)
05-22 11:59:20.271: E/AndroidRuntime(4285): 	at android.os.Looper.loop(Looper.java:156)
05-22 11:59:20.271: E/AndroidRuntime(4285): 	at android.app.ActivityThread.main(ActivityThread.java:4987)
05-22 11:59:20.271: E/AndroidRuntime(4285): 	at java.lang.reflect.Method.invokeNative(Native Method)
05-22 11:59:20.271: E/AndroidRuntime(4285): 	at java.lang.reflect.Method.invoke(Method.java:511)
05-22 11:59:20.271: E/AndroidRuntime(4285): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-22 11:59:20.271: E/AndroidRuntime(4285): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-22 11:59:20.271: E/AndroidRuntime(4285): 	at dalvik.system.NativeStart.main(Native Method)
В чем может бьіть проблема?

Re: Проблема с ArrayIndexOutOfBoundsException

Добавлено: 22 май 2015, 13:09
Foenix
Бомба не взорвалась

Re: Проблема с ArrayIndexOutOfBoundsException

Добавлено: 22 май 2015, 13:47
Alibard
Foenix писал(а):Бомба не взорвалась
Ха ха ха. А по теме ответ можна? Я не виноват что фирма так назьіваетса.

Re: Проблема с ArrayIndexOutOfBoundsException

Добавлено: 22 май 2015, 14:03
altwin
А в чем может быть проблема выхода за пределы массива? Ключ не существует. Добавьте проверку перед тем как к нему обращаться и если пытаетесь получить данные из другого потока - дождитесь пока они будут полученны перед обращением к массиву.

P.S. асинх таски -это зло... не нужно привыкать к плохому - http://code.hootsuite.com/asynchronous- ... -the-ugly/

Re: Проблема с ArrayIndexOutOfBoundsException

Добавлено: 22 май 2015, 15:48
Foenix
Артем, а можешь растолковать п.7 отсюда
http://futurice.com/blog/top-7-tips-for ... on-android
вот прям полностью.

Re: Проблема с ArrayIndexOutOfBoundsException

Добавлено: 22 май 2015, 16:21
altwin
В большинстве своем там много текста касательно всей статьи и пояснений на примере, суть вся в том, что подписываясь на обсервер ты получаешь strong reference, т.е.не зависимо от типа твоего объекта и его жизни, он не будет уничтожен. К примеру, ты запускаешь в андроиде фоновый процесс и ждешь получения информации, но пользователь или система по какой -то причине закрывает активити, фоновый поток - продолжает работать... и более того, по завершении или ошибке результат будет сформирован и отправлен, вот только получать его некому и это черевато проблемами и всякими там переполнениями памяти. Для того чтобы этого избежать грубо говоря и используется Subscriber, он позволяет "отписаться" от задачи в любом месте и в любой момент, к примеру в андроиде в onDestroy. И соответсвенно проблем можно избежать. Тут вся суть в том, что ты не работаешь с потоками в принципе, сама по себе rx работает в главном потоке, и дальше уже насильно может переводиться в фоновые или паралельные, но ты по сути этого не контролируешь. Ты говоришь к примеру - эта коллекция должна быть observable, что по сути аналог обычного iterable объекта, в котором вместо получения, реализованно добавление данных. Дальше уже включаются планировщики, определяется в каком потоке выполняется, что делать по наступлению событий и куда передавать результаты. Вся суть в том, что это по сути создает отдельный жизненный цикл, это не проблема, поскольку все работает благодаря "магии", но тебе нужно четко контролировать, когда прекращать выполнение.

Re: Проблема с ArrayIndexOutOfBoundsException

Добавлено: 22 май 2015, 16:32
Foenix
дальше так вот ссылка дается
https://github.com/ReactiveX/RxJava/issues/386
я вообще в шоке, люди на своей тарабарщине разговаривают. Если до этого я понимал что к чему, а тут уже завязла.

Re: Проблема с ArrayIndexOutOfBoundsException

Добавлено: 22 май 2015, 16:33
Foenix
и ты не пояснил, там про weak ref говорится дальеш как вариант, только я не поняла то ли хорошо это то ли плохо

Re: Проблема с ArrayIndexOutOfBoundsException

Добавлено: 22 май 2015, 17:18
altwin
Foenix писал(а):и ты не пояснил, там про weak ref говорится дальеш как вариант, только я не поняла то ли хорошо это то ли плохо
Это хорошо потому, что система может контролировать стандартными средствами и ты можешь в любой момент использова ть unsubscribe , с "жесткими" ссылками отписаться нельзя никак.

Re: Проблема с ArrayIndexOutOfBoundsException

Добавлено: 23 май 2015, 13:02
Alibard
altwin писал(а):А в чем может быть проблема выхода за пределы массива? Ключ не существует. Добавьте проверку перед тем как к нему обращаться и если пытаетесь получить данные из другого потока - дождитесь пока они будут полученны перед обращением к массиву.

P.S. асинх таски -это зло... не нужно привыкать к плохому - http://code.hootsuite.com/asynchronous- ... -the-ugly/

Проблема сосотоит в том что превь фото которьіе берутса из етого масива загружаютса все. Но когда идет клик по последним 2м то крит программьі. А почему Асинтакск зло?

Re: Проблема с ArrayIndexOutOfBoundsException

Добавлено: 24 май 2015, 14:16
Dark67
AsyncTask не зло, но нужно знать где и когда им пользоваться.
AsyncTask предназначен для кратковременной работы, которая не повторяется слишком часто. Если создается множество AsyncTask или они выполняются в течении долгого времени, вероятно, выбран неправильный класс.
И к тому же, начиная с Android 3.2, AsyncTask не создает поток для каждого экземпляра. Вместо этого он создает объект Executor для выполнения фоновой работы всех экземпляров AsyncTask в одном фоновом потоке. Это значит, что экземпляры будут выполняться друг за другом, а затянувшаяся операция AsyncTask не позволит другим экземплярам AsyncTask получить процессоров время. В таком случае лучше организовать многопоточное выполнение, используя объекты Handler.

Re: Проблема с ArrayIndexOutOfBoundsException

Добавлено: 24 май 2015, 14:50
altwin
Dark67 писал(а):AsyncTask не зло, но нужно знать где и когда им пользоваться.
AsyncTask предназначен для кратковременной работы, которая не повторяется слишком часто. Если создается множество AsyncTask или они выполняются в течении долгого времени, вероятно, выбран неправильный класс.
И к тому же, начиная с Android 3.2, AsyncTask не создает поток для каждого экземпляра. Вместо этого он создает объект Executor для выполнения фоновой работы всех экземпляров AsyncTask в одном фоновом потоке. Это значит, что экземпляры будут выполняться друг за другом, а затянувшаяся операция AsyncTask не позволит другим экземплярам AsyncTask получить процессоров время. В таком случае лучше организовать многопоточное выполнение, используя объекты Handler.
Вы статью прочитали по ссылке? Мне не нужно 10 способов запустить поток, каждый из который рождает собственные проблемы и тем более не нужно постоянно выбирать, плодить кучу сущностей чтобы контролировать процесс или передавать данные. Мне нужен инструмент решающий типовые проблемы многопоточного программирования. Такой инструмент придуман давно. 99% задач в мире андроида позволяет решать типовыми средствами избегая вообще всех проблем многопоточных приложений. Любая сущность приносящая собственные проблемы и особенно приносящая больше, чем решает - это зло. AsyncTask - это не самое кривое и бездарное зло в андроид, но какашка может вонять меньше или больше - она всеравно воняет....

P.S> к слову ограничение сферы использования и задач - зло еще большее, ведь отвернувшись от какашки или закрыв нос - она и правда уже не воняет... но вы уверенны, что это решение?