AsyncTask,将数据对象发送到Thread UI

时间:2014-01-23 17:19:20

标签: java android multithreading android-asynctask

我有我的Thread UI。我需要下载信息来更新界面。 在我的AsyncTask中,我将数据放在我在Json中恢复的类“Program”中,并希望将此类发送到我的Thread UI。但我真的不知道该怎么做。

我的AsyncTask在我的主要活动之外。

AsyncTask:

    public class GetMediaInfo extends AsyncTask<String, String, String> { 
    private static final String LOG_TAG = Api.class.getSimpleName();
    private Exception mException = null;

static String url_youtube_unik;
static Gson gson = null;
static String infoProgramDean = null, infoProgramTmdb = null, infoCanal = null, trailerYoutube = null, infoProgramBouygues = null;
String code;
String url;

Program program;
Canal canal;
private Handler handler;

public GetMediaInfo(Handler handler, Program program, Canal canal) {
    this.handler = handler;
    this.canal = canal;
    this.program = program;
}

@Override
protected void onPreExecute () {
    Log.v(LOG_TAG ,"PreExecute GetMediaInfo");
}

protected void onPostExecute (String result) {
    Log.v(LOG_TAG ,"PostExecute GetMediaInfo");
    //Message msgObj = handler.obtainMessage();
    //Bundle b = new Bundle();

    if (result != null) {
        //b.putString("functionName", "UpdateInfoScreen");
        //b.putString("message", "Update Info Program");

        // HOW TO SEND MY Program to Thread Ui and update Interface ????????


    } else {
        Log.v(LOG_TAG, "Error getCurrentProgram : " + mException.getMessage());
        //b.putString("functionName", "Message");
        //b.putString("message", "Error getCurrentProgram : " + mException.getMessage());
    }   
   // msgObj.setData(b);

   // handler.sendMessage(msgObj);
}

@Override
protected String doInBackground(String... params) {
    Log.v(LOG_TAG ,"doInBackground GetMediaInfo");

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

    // Channel qu'on a récupéré
    //String tvChannelId = canal.getId();         <=================================================== A DELETE avec STB
    String tvChannelId = "1";
    boolean found = false;

     gson = new Gson();
     String idProgram = null;
     String nameProgram = null;
     String typeProgram = null;


    // --> Récupération Information du programme en cours + la liste du programme de la chaîne <--
    // Prépare url bouygues Canal
     url = "http://openbbox.flex.bouyguesbox.fr:81/V0/Media/EPG/Live?period=1&TVChannelsId=" + tvChannelId;

     //On récupère information du program avec le site de Bouygues
     try {
        infoCanal = Api.getInfoMedia(url);
        JSONObject myJson; 
        myJson = new JSONObject(infoCanal);

        // "{\"id\": 51,\"nom\": \"Ma Chaîne Sport\", \"ListeProgrammes\": { \"Programme\": [{\"id\": 95347742,\"nom\": \"Bien-être\",\"description\": \"Emission du bien-être.\",\"debut\": \"2014-01-23T06:00:00Z\",\"fin\": \"2014-01-23T06:30:00Z\"}]}}";
        idProgram = myJson.getJSONObject("ListeProgrammes").getJSONArray("Programme").getJSONObject(0).optString("id");
        nameProgram = myJson.getJSONObject("ListeProgrammes").getJSONArray("Programme").getJSONObject(0).optString("nom");

        Log.v("idProgram","= " + idProgram);
        Log.v("nameProgram","= " + nameProgram);
     } catch (ServerException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
     } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
     }

    //FAKE ID Pour le TEST ID 
    idProgram = "95262486";

    // Prépare url bouygues Info Program
    url = "http://openbbox.flex.bouyguesbox.fr:81/V0/Media/EPG/Live?programId="+ idProgram;

    try {
        JSONObject myJson;
        infoProgramBouygues = Api.getInfoMedia(url);
        myJson = new JSONObject(infoProgramBouygues);
        typeProgram = myJson.getJSONObject("Programme").getJSONObject("ListeGenres").optString("genre");
                Log.v("genreProgram","= " + typeProgram);


        // On ajoute heure de début et fin (format: "debut": "2014-01-22T20:45:00Z)
        String beginningTime = myJson.getJSONObject("Programme").getJSONObject("Diffusion").optString("debut").substring(10);
        String endTime = myJson.getJSONObject("Programme").getJSONObject("Diffusion").optString("fin").substring(10);

        program.setBeginningTime(beginningTime);
        program.setEndTime(endTime);            
    } catch (ServerException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    // GENRE == FILM
    if (typeProgram.equals("Film")) {
        // Remplace espaces par des +, puis &apos; par des
        nameProgram = nameProgram.replaceAll("\\s","+").replaceAll("&apos;", "'").replaceAll("&amp;", "");

        //nameProgram = "intouchables"; <============================================================================ A DELETE bon program

        Log.v("nameProgram", "= " + nameProgram);

        // Prépare URL DEAN
        url = "http://deanclatworthy.com/imdb/?q="+nameProgram;

        try {
            infoProgramDean = Api.getInfoMedia(url);
            JSONObject myJson;
            myJson = new JSONObject(infoProgramDean);
            code = null;
            code = myJson.optString("code");                            

            // Film trouvé
            if(code.equals("")) {
                String IdProgramIMDB = myJson.optString("imdbid");
                Log.v("IdProgramIMDB", "= " + IdProgramIMDB);

                // FAKE ID IMDB !!!! <============================================================= A DELETE
                IdProgramIMDB = "tt0407304";

                // Prépare URL TMDB
                url = "http://api.themoviedb.org/3/movie/"+ IdProgramIMDB + "?api_key=a9cd33535bcdf6537692b5a25e5ef98e";

                infoProgramTmdb = Api.getInfoMedia(url);
                myJson = new JSONObject(infoProgramTmdb);   
                code = null;
                code = myJson.optString("status_code");

                // Film trouvé sur TMDB sinon on prend les informations de bouygues (code error 6)
                if(code.equals("")) {
                    program = gson.fromJson(infoProgramTmdb, Program.class);    

                    Log.v("runtimeProgram ", "= " + program.getRuntime());
                    Log.v("posterPathProgram ", "= " + program.getposterPath());            

                    found = true;
                }
            }

            nameProgram = "intouchables"; // FAKE Name Program  !!!! <============================================================= A DELETE

            // Récupération Youtube (5 vidéos trailers max)
            url = "https://gdata.youtube.com/feeds/api/videos?q=" + nameProgram + "+trailer+movies&orderby=viewCount&start-index=1&max-results=5&v=2&alt=json";
            trailerYoutube = Api.getInfoMedia(url);

            //feed => {} => entry [] get(1 à 5) => id{} after last :
            // Format Json { ..., "feed":{ ..., "entry":[{..., "id":{"$t":"tag:youtube.com,2008:video:17CLlZuiBkQ"}}, {"id":{...}}, {"id":{...}}, {"id":{...}}, {"id":{...}}]}}
            myJson = new JSONObject(trailerYoutube);

            if(!myJson.getJSONObject("feed").optString("entry").equals(""))
            {
                JSONArray dataYoutube = myJson.getJSONObject("feed").getJSONArray("entry");
                //nameProgram = myJson.getJSONObject("ListeProgrammes").getJSONArray("Programme").getJSONObject(0).optString("nom");
                for(int i=0;i<5;i++) {
                     String[] tag = dataYoutube.getJSONObject(i).getJSONObject("id").optString("$t").split(":");

                    //program.setYoutubeUri(new YoubuteURI(tag[tag.length-1]));             // !!!! <============================================================= A ajoute dans la List Youtube de la classe program !!!!!
                    Log.v("idYoutube","= " + tag[tag.length-1]);
                }
            }
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ServerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // Si pas trouvé ou pas un film, on utilise information de Bouygues
        if(found != true) {
            Log.v("IdProgramIMDB","Not Found => BDD Bouygues");  
            //Log.v("programBouyges","Not Found => BDD Bouygues   " + infoProgramBouygues);
            JSONObject myJson;
             try {
                 Log.v("bbbbbbbbb","= ");
                myJson = new JSONObject(infoProgramBouygues);
                String test = myJson.optString("Programme");
                Log.v("aaaaaaaa","= " + infoProgramBouygues);
                program = gson.fromJson(test, Program.class);               // !!!! <============================================================= Ca ajoute pas dans la classe A VOIR !!!!!


            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            Log.v("TitleProgram ", "= " + program.getTitle());
        }

        // Utilisation des informations de la chaine + la liste de programme            // !!!! <============================================================= Ca ajoute pas dans la classe A VOIR !!!!!
        canal = gson.fromJson(infoCanal, Canal.class);

        Log.v("NomCanal ", "= " + canal.getName());                                 // !!!! <============================================================= Voir si ca ajoute les valeurs ds la liste des programs!!!!!
    }
    return "youpi";
}
}

主要:

String canalId = msg.getData().getString("message");                                    
currentCanal = new Canal(canalId);
currentProgram = new Program();                 
GetMediaInfo  getMediaInfo = new  GetMediaInfo(handler, currentProgram, currentCanal);
getMediaInfo.execute(NetworkUtils.getUrlHttp(getApplicationContext()));

&GT;编辑1:

谢谢!

对不起,我对Android开发并不是很好,我发现我的学校项目。

我现在可以在Thread UI中使用我的课程了!

这不仅仅是更新我的应用Android的界面,而且还发送我的webApp中的数据与我的Thread UI中创建的myWebsocket(我创建了另一个asynctask来做和交互)。

各方: 1 =&gt;订阅我的应用和STB之间的ChannelID(SetTopBox)=&gt;完成=&gt;将带有我的ID的处理程序消息发送到我的Thread UI

2 =&gt;在我的STB中启动我的WebApp =&gt;完成=&gt;发送处理程序消息确定

3 =&gt;启动我的WebSocket =&gt;完成=&gt;发送处理程序消息确定

4 =&gt;获取ChannelID WebApp =&gt;完成=&gt;使用ChannelID将处理程序消息发送到我的Thread UI

5 =&gt;获取当前运河/媒体=&gt;完成=&gt;将带有我的ID Canal的处理程序消息发送到我的Thread UI

6 =&gt;现在!获取媒体信息=&gt;使用Interface

将类程序发送到我的Thread UI

7 =&gt;因此,请更新Interface App并启动最后一个asynctask以在我的WebApp中发送数据 我记得5/6/7是否有新节目

在我的第一个asynctask之后,我在Handler Thread UI中调用了下一个,对于Thread Ui(fragmentActivity)和Handler来说它不是太重了?我的经纪人变得很大。

&GT;编辑2: 我将阅读有关runOnUiThread的信息

2 个答案:

答案 0 :(得分:1)

您需要联系Thread UI

 [your_activity_instance].runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                //update here
                            }
                     });

答案 1 :(得分:0)

  

protected void onPostExecute(String result){

将在Thread UI上执行,您可以安全地在那里执行UI更改。通知您完成AsyncTask的活动的一种常用方法是使用Interface。您的活动实现了一些接口,并将其传递给AsyncTask,AsyncTask将使用此接口将结果传递给Activity。这要求您在活动配置更改期间更新AsyncTask中的此接口引用。