Совместно используемые данные между действиями и потоками - PullRequest
0 голосов
/ 26 декабря 2011

У меня есть приложение под названием ListApp, подобное этому

public class ListApp extends Application {

public static RSmovies[] appRsMovie=new RSmovies[1];
public static ImageDownloader id =new ImageDownloader();
public static String cur=null;
public static String movieGetInfo="http://hive.tn/TMDb/test11.php?param=";

}

В своем первом упражнении я пытался внести изменения в appRsMovie в новой теме, например

new Thread(new Runnable() {
        @Override
        public void run() {

            try {
                InputStream source = retrieveStream("http://hive.tn/TMDb/test6.php");
                Gson gson = new Gson();

                Reader reader = new InputStreamReader(source);
                    ListApp.appRsMovie = gson.fromJson(reader, RSmovies[].class);

                lv
                        .setAdapter(new LazyAdapter1(
                                ListControlActivity.this, z));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();

Сбой приложения, и это исключение, которое я получил

12-26 17:21:55.643: W/dalvikvm(958): Exception Ljava/lang/RuntimeException; thrown during Lcom/test/list/ListApp;.<clinit>

Ответы [ 2 ]

2 голосов
/ 26 декабря 2011

Попробуйте это:

попробуйте переместить утверждение

lv.setAdapter(new LazyAdapter1(ListControlActivity.this, z));

из потока в обработчик

создать обработчик:

    Handler handler = new Handler() {

    public void handleMessage(android.os.Message msg) {
        lv.setAdapter(new LazyAdapter1(ListControlActivity.this, z));
    }
};

и замените оператор lv.setAdapter на sendMessage обработчика

new Thread(new Runnable() {
    @Override
    public void run() {

        try {
            InputStream source = retrieveStream("http://hive.tn/TMDb/test6.php");
            Gson gson = new Gson();

            Reader reader = new InputStreamReader(source);
                ListApp.appRsMovie = gson.fromJson(reader, RSmovies[].class);

            handler.sendEmptyMessage(0);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}).start();
0 голосов
/ 26 декабря 2011

Вы не можете обновить просмотр списка (или любое другое представление) из любого потока, кроме потока пользовательского интерфейса.Используйте AsyncTask вместо простого потока и убедитесь, что вы обновляете представление списка в onPostExecute().

...