FATAL Exception main при отображении изображений в виде списка - PullRequest
0 голосов
/ 01 ноября 2011

Я на начальном уровне, я заполняю список просмотра различными удаленными изображениями и текстом в приложении для Android.Я использую адаптер для заполнения списка и AsynTask для загрузки изображений.Но я сталкиваюсь с двумя проблемами и пробовал большинство из них в течение многих дней, но, к сожалению, не смог добиться успеха.Первая проблема заключается в том, что первое изображение и текст появляются в первой строке списка и исчезают, а вторая строка заполняется вторым изображением и текстом, а также исчезает, и аналогично каждая строка появляется с изображениями и текстом и исчезает.Вторая проблема заключается в том, что когда появляется последняя строка, приложение перестает работать и перестает работать, выдавая исключение ниже:

11-01 20:03:56.449: ERROR/AndroidRuntime(29665): FATAL EXCEPTION: main
11-01 20:03:56.449: ERROR/AndroidRuntime(29665): java.lang.NullPointerException

Это мой основной класс:

public class ParseImagesActivity extends ListActivity {
String myURL;
String xml; 
 Document doc; 
 NodeList nodes; 
 //int i=5;
 int j=0;
 int equal;
 int h;
 String[]  length = {"1","2","3","4","5","6","7","8","9",null};

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.main);

        xml = XmlParser.getXML("http://url.com");
         doc = XmlParser.XMLfromString(xml);
        nodes = doc.getElementsByTagName("item");
        Element g = (Element)nodes.item(j);
        startParsing(XmlParser.getValue(g,"thumb"));

    }

В основном классе я вызываю метод startParsingпередав ему URL-адрес 1 для доступа к первому изображению с помощью функции XmlParser.getValue (g, «thumb»), которая возвращает URL-адрес из класса XmlParser.Метод startParsing:

private void startParsing(String url) {  

     new backgroundLoadListView().execute(url);

 }

public class backgroundLoadListView extends
        AsyncTask<String, Void, String> {

    @Override
protected void onPostExecute(String unused) {
        // TODO Auto-generated method stub

     if(j<nodes.getLength()){
   setListAdapter(new MyCustomAdapter(ParseImagesActivity.this, R.layout.row, length));
            Log.e("post Execute","post execute="+j);

        equal=j;
        j++;
        Element h = (Element)nodes.item(j);
        startParsing(XmlParser.getValue(h,"thumb"));
        }


    }

    @Override
    protected void onPreExecute() {

        }

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
        //Log.e("do in back","do in back="+j);
         String url = params[0];
        preLoadSrcBitmap(url);
        return null;
    }

}

Здесь я вызываю конструктор MyCustomerAdapter, а в методе postExecute вызываю метод startParsing, передавая url2,3,4, ... и т. д., чтобы получить доступ к другим изображениям.Класс MyCustomAdapter и метод preloadSrcBitmap:

public class MyCustomAdapter extends ArrayAdapter<String> {
    Bitmap bm;


    public MyCustomAdapter(Context context, int textViewResourceId,
            String[] objects) {
        //
        super(context, textViewResourceId, objects);

        // TODO Auto-generated constructor stub

        bm = srcBitmap;
        Log.e("my customer adapter","my adapter"+j);

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        //return super.getView(position, convertView, parent);

        View row = convertView;

        if(row==null){
            LayoutInflater inflater=getLayoutInflater();
            row=inflater.inflate(R.layout.row, parent, false);  
                                  }

        Log.e("getview",j+"calls");
        TextView label=(TextView)row.findViewById(R.id.weekofday);
        ImageView icon=(ImageView)row.findViewById(R.id.icon);
        if(j<nodes.getLength())
        {
            if(equal==position)
            {
                Log.e("text view calls",""+equal);
            Element f = (Element)nodes.item(equal);

        label.setText(XmlParser.getValue(f, "title"));
        icon.setImageBitmap(bm);
        }

        }
        return row;
        }   

}

Bitmap srcBitmap;
private void preLoadSrcBitmap(String url){
    //Log.e("preloadsrcbitmap","preloadsrcbitmap="+j);
    BitmapFactory.Options bmOptions;
    bmOptions = new BitmapFactory.Options();
    bmOptions.inSampleSize = 1;

    srcBitmap = LoadImage(url, bmOptions);

}



/** Called when the activity is first created. */

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {

    String selection = l.getItemAtPosition(position).toString();
    Toast.makeText(this, selection, Toast.LENGTH_LONG).show();  
}

private Bitmap LoadImage(String URL, BitmapFactory.Options options)
{       
    Bitmap bitmap = null;
    InputStream in = null;       
    try {
        in = OpenHttpConnection(URL);
        bitmap = BitmapFactory.decodeStream(in, null, options);
        in.close(); 
    } catch (IOException e1) {
    }

    return bitmap;                  
}

private InputStream OpenHttpConnection(String strURL) throws IOException{
    InputStream inputStream = null;
    URL url = new URL(strURL);
    URLConnection conn = url.openConnection();

    try{
        HttpURLConnection httpConn = (HttpURLConnection)conn;
        httpConn.setRequestMethod("GET");
        httpConn.connect();

        if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
            inputStream = httpConn.getInputStream();    

        }   
    }
    catch (Exception ex){
    }

    return inputStream; 
}

И большое спасибо людям, которые помогают мне с упомянутыми проблемами.Я не могу понять их.

1 Ответ

0 голосов
/ 01 ноября 2011

Все, что обновляет пользовательский интерфейс (взаимодействует с Activity) с помощью AsyncTask, должно иметь следующую структуру (набросок, потому что я не делал этого некоторое время: P):

//AsyncTask starts here
//code that doesn't run on the UI thread
myASyncTask.runOnUiThread(new Runnable() {
    //update your UI stuff here
    };
//do more non-UI stuff here

Это выглядитвы пытаетесь обновить ImageViews и TextViews синхронно в методе AsyncTask.Это приведет к фатальным ошибкам.Попробуйте код выше:)

Надеюсь, это поможет!Дайте мне знать, если вам нужно больше разъяснений.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...