在Android的主要活动取得的AsyncTask的结果,并onCreate方法之外添加视图XML布局 [英] Android getting result of AsyncTask in main Activity and add views to XML layout outside onCreate method
问题描述
我想从的Youtube
获取视频列表将显示在我的活动
。
我创建的主要活动 MediaActivity.java
有两种方法,的onCreate
和的getResult
这是从的AsyncTask
类的<code> onPostExecute 方法调用。
这里是 MediaActivity
code:
I'm trying to obtain a list of videos from Youtube
to be displayed on my Activity
.
I've created the main activity MediaActivity.java
with two methods, onCreate
and getResult
which is called from the onPostExecute
method in the AsyncTask
class.
Here is the MediaActivity
code:
public class MediaActivity extends Activity {
YoutubeConnect youtubeRequest = new YoutubeConnect();
ViewGroup media;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
youtubeRequest.execute();
setContentView(R.layout.media);
media = (ViewGroup) this.findViewById(R.layout.media);
}
public void getResult(String result) throws JSONException {
JSONObject jsonObj = new JSONObject(result);
JSONObject jsonObj2 = jsonObj.getJSONObject("feed");
JSONArray the_json_array = jsonObj2.getJSONArray("entry");
int size = the_json_array.length();
for (int i = 0; i < size; i++) {
//get all infos
[...]
LinearLayout main = new LinearLayout(this);
main.setOrientation(0);
main.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
//thumb
WebView thumb = new WebView(this);
thumb.loadUrl(video_thumb);
main.addView(thumb);
LinearLayout right = new LinearLayout(this);
right.setOrientation(1);
right.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
//title
TextView title = new TextView(this);
title.setText(video_title);
right.addView(title);
//description
TextView description = new TextView(this);
description.setText(video_description.substring(100)+"...");
right.addView(description);
//views
TextView views = new TextView(this);
views.setText("Views: "+video_views);
right.addView(views);
main.addView(right);
this.media.addView(main);
}
}
}
这是我的自定义的AsyncTask
类code:
This is my custom AsyncTask
class code:
public class YoutubeConnect extends AsyncTask<String, String, String> {
public YoutubeConnect() {
}
@Override
protected String doInBackground(String... params) {
try {
String APIurl = "https://gdata.youtube.com/feeds/api/videos?author=author&alt=json";
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(APIurl);
HttpResponse response = httpClient.execute(request);
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
StringBuilder builder = new StringBuilder();
for (String line = null; (line = reader.readLine()) != null;) {
builder.append(line).append("\n");
}
return builder.toString();
} catch (Exception e) {
return null;
}
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
MediaActivity mainthread = new MediaActivity();
try {
mainthread.getResult(result);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这是日志:
05-17 11:01:26.383: E/AndroidRuntime(2687): FATAL EXCEPTION: main
05-17 11:01:26.383: E/AndroidRuntime(2687): java.lang.NullPointerException
05-17 11:01:26.383: E/AndroidRuntime(2687): at android.content.ContextWrapper.getResources(ContextWrapper.java:81)
05-17 11:01:26.383: E/AndroidRuntime(2687): at android.view.View.<init>(View.java:2696)
05-17 11:01:26.383: E/AndroidRuntime(2687): at android.view.ViewGroup.<init>(ViewGroup.java:374)
05-17 11:01:26.383: E/AndroidRuntime(2687): at android.widget.LinearLayout.<init>(LinearLayout.java:166)
05-17 11:01:26.383: E/AndroidRuntime(2687): at wachipi.palio.MediaActivity.getResult(MediaActivity.java:47)
05-17 11:01:26.383: E/AndroidRuntime(2687): at wachipi.palio.YoutubeConnect.onPostExecute(YoutubeConnect.java:41)
05-17 11:01:26.383: E/AndroidRuntime(2687): at wachipi.palio.YoutubeConnect.onPostExecute(YoutubeConnect.java:1)
05-17 11:01:26.383: E/AndroidRuntime(2687): at android.os.AsyncTask.finish(AsyncTask.java:602)
05-17 11:01:26.383: E/AndroidRuntime(2687): at android.os.AsyncTask.access$600(AsyncTask.java:156)
05-17 11:01:26.383: E/AndroidRuntime(2687): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
05-17 11:01:26.383: E/AndroidRuntime(2687): at android.os.Handler.dispatchMessage(Handler.java:99)
05-17 11:01:26.383: E/AndroidRuntime(2687): at android.os.Looper.loop(Looper.java:137)
05-17 11:01:26.383: E/AndroidRuntime(2687): at android.app.ActivityThread.main(ActivityThread.java:4424)
05-17 11:01:26.383: E/AndroidRuntime(2687): at java.lang.reflect.Method.invokeNative(Native Method)
05-17 11:01:26.383: E/AndroidRuntime(2687): at java.lang.reflect.Method.invoke(Method.java:511)
05-17 11:01:26.383: E/AndroidRuntime(2687): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-17 11:01:26.383: E/AndroidRuntime(2687): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-17 11:01:26.383: E/AndroidRuntime(2687): at dalvik.system.NativeStart.main(Native Method)
各种尝试的 setContenView
和的ViewGroup
线在里面之前的的getResult
方法,但它给了我其他错误。我也试着使用调试器,但它给了我错误源未找到
,我认为有些事情在我安装失踪。
我真的不明白为什么它会抛出这个错误并不能找到任何关于它。
Before various attempt the setContenView
and ViewGroup
lines were inside the getResult
method, but it gave me other errors. I've also tried to use the debugger but it gives me error "source not found"
, I think something is missing in my installation.
I really can't understand why it throws this error and can't find anything about it.
推荐答案
这是例外,可能是来自于你实例化一个新的 MediaActivity
而不是使用活动
从中启动线程的实例:
That exception probably comes from you instantiating a new MediaActivity
instead of using the Activity
instance from which you started the thread:
MediaActivity mainthread = new MediaActivity();//don't do this
而不是通过你的 MediaActivity
在 YoutubeConnect
任务,并使用该引用调用<$ C $的参考C>的getResult :
Instead pass a reference of your MediaActivity
in the YoutubeConnect
task and use that reference to call getResult
:
private MediaActivity activityRef;
public YoutubeConnect(MediaActivity activityRef) {
this.activityRef = activityRef;
}
,并在 onPosteExecute
方法:
@Override
protected void onPostExecute(String result) {
try {
activityRef.getResult(result); // you should have some ckecks to see if the activity is still available.
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
然后作出新的 YoutubeConnect
任务:
YoutubeConnect youtubeRequest;
ViewGroup media;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.media);
youtubeRequest = new YoutubeConnect(this);
youtubeRequest.execute();
media = (ViewGroup) this.findViewById(R.layout.media);
}
此外,利用这样的:
Also, with this:
media = (ViewGroup) this.findViewById(R.layout.media);
您是通过布局文件名搜索一个查看
在当前布局,而不是 ID
。它应该是这样的:
You're searching for a View
in the current layout by a layout file name and not an id
. It should be like this:
media = (ViewGroup) this.findViewById(R.id.view_id_from_the_layout);
这篇关于在Android的主要活动取得的AsyncTask的结果,并onCreate方法之外添加视图XML布局的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!