我有我的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 ' par des
nameProgram = nameProgram.replaceAll("\\s","+").replaceAll("'", "'").replaceAll("&", "");
//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 UI7 =&gt;因此,请更新Interface App并启动最后一个asynctask以在我的WebApp中发送数据 我记得5/6/7是否有新节目
在我的第一个asynctask之后,我在Handler Thread UI中调用了下一个,对于Thread Ui(fragmentActivity)和Handler来说它不是太重了?我的经纪人变得很大。
&GT;编辑2: 我将阅读有关runOnUiThread的信息
答案 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中的此接口引用。