我使用一个线程和支架来下载一些数据,然后用按钮显示一个新的视图,允许你进一步浏览应用程序。但我认为我做错了什么,因为我使用的任何下一个活动都会在setContentView行上出现空指针异常。当我评论这一行时,没有任何问题(所以我猜这意味着该活动在清单中被声明为良好,并正常启动)。由于线程的原因,新活动似乎没有地方设置内容或其他内容。。
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import com.hera.ontdekdelft.model.JJsonResponse;
import com.hera.ontdekdelft.listclasses.ListData;
import android.app.Activity;
import android.content.Intent;
import android.content.res.AssetManager;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class StartUp extends Activity
{
private static final String tag = StartUp.class.getName();
public static final String SERIALIZEDDATA = "SerializedData";
ProgressBar pbar;
TextView tv1;
Drawable background;
Button btCategory, btMakeMyDay;
RelativeLayout loadedBackground, loadingBackground;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
LoadData task = new LoadData();
task.execute();
String language = Locale.getDefault().getISO3Language();
background = getBackgroundImage();
setContentView(R.layout.startup_loading);
tv1=(TextView)findViewById(R.id.tvloading);
if(language.equals("nld")){
tv1.setText("bijwerken");
}else{
tv1.setText("loading");
}
pbar=(ProgressBar)findViewById(R.id.progressBar1);
pbar.setVisibility(1);
loadingBackground=(RelativeLayout)findViewById(R.id.startup_background_loading);
loadingBackground.setBackgroundDrawable(background);
}
public Drawable getBackgroundImage(){
Drawable d;
Calendar c = Calendar.getInstance();
int month = c.get(Calendar.MONTH);
Log.i("month",String.valueOf(month));
switch (month){
default: d = getResources().getDrawable(R.drawable.homescreen_summer);break;
case 0:d = getResources().getDrawable(R.drawable.homescreen_winter);break;
case 1:d = getResources().getDrawable(R.drawable.homescreen_winter); break;
case 2:d = getResources().getDrawable(R.drawable.homescreen_spring);break;
case 3:d = getResources().getDrawable(R.drawable.homescreen_spring);break;
case 4:d = getResources().getDrawable(R.drawable.homescreen_spring);break;
case 5:d = getResources().getDrawable(R.drawable.homescreen_summer); break;
case 6:d = getResources().getDrawable(R.drawable.homescreen_summer); break;
case 7:d = getResources().getDrawable(R.drawable.homescreen_summer); break;
case 8:d = getResources().getDrawable(R.drawable.homescreen_autumn); break;
case 9:d = getResources().getDrawable(R.drawable.homescreen_autumn); break;
case 10:d = getResources().getDrawable(R.drawable.homescreen_autumn); break;
case 11:d = getResources().getDrawable(R.drawable.homescreen_winter); break;
}
return d;
}
private class LoadData extends AsyncTask<Void, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
protected void onPostExecute(String language) {
super.onPostExecute(language);
setContentView(R.layout.startup_loaded);
btCategory=(Button)findViewById(R.id.btn_category);
loadedBackground=(RelativeLayout)findViewById(R.id.startup_background_loaded);
loadedBackground.setBackgroundDrawable(background);
if(language.equals("nld")){
btCategory.setText("Ontdek Delft");
}else{
btCategory.setText("Discover Delft");
}
//newactivitybutton
btCategory.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
startActivity(new Intent(StartUp.this, Overview.class));
finish();
}
});
}
@Override
protected String doInBackground(Void... params) {
String language = Locale.getDefault().getISO3Language();
AssetManager assetManager = getAssets();
InputStream inputStream = null;
try {
inputStream = assetManager.open("originalDelftJson.json");
} catch (IOException e) {
Log.e("tag", e.getMessage());
}
ObjectMapper objectMapper = new ObjectMapper();
Log.i("tijdlog","start parsing" );
try {
List<JJsonResponse> jsonResponse = objectMapper.readValue(inputStream, new TypeReference<List<JJsonResponse>>() { });
Log.i("tijdlog","einde parsing" );
//
final List<JJsonResponse> myGlobalVariable = jsonResponse;
((ApplicationController)getApplication()).setGlobalData(myGlobalVariable);
List<ListData> ld = new ArrayList<ListData>();
int selectedPic;
JJsonResponse e;
int k =0;
for(int i=0;i < jsonResponse.size() ;i++){
e = jsonResponse.get(i);
for(int j=0; j<e.venue.themes.size();j++){
if (e.venue.themes.get(j).mobile == true){
selectedPic = 0;
String tip;
String theme;
if (language.equalsIgnoreCase("nld")){
tip=e.venue.tip;
theme=e.venue.themes.get(j).name;
}else{
tip=e.venue.tip_en;
theme=e.venue.themes.get(j).name_en;
}
// pic selected pic
String photoUrl = null;
if (e.venue.venue_photos.isEmpty() == false){
for(int l=0; l < e.venue.venue_photos.size() ;l++){
if(e.venue.venue_photos.get(l).selected == true){
selectedPic = l;
}
photoUrl=e.venue.venue_photos.get(selectedPic).medium;
}
}else
{
photoUrl=null; // null no pic--> add link later
}
ld.add(new ListData(e.venue.id, e.venue.name, photoUrl, tip, theme));//nieuwe maken
k++;
}
}
}
Collections.sort(ld, ListData.ListDataThemeAndNameComparator); // vergelijken op thema
for(int z=0;z < ld.size() ;z++){
Log.i("ld nr " + String.valueOf(z), ld.get(z).name + " theme: " + ld.get(z).theme + " & venue id= "+ ld.get(z).venueID);
}
// save
((ApplicationController)getApplication()).setListData(ld);
} catch (JsonParseException e) {
// XXX Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// XXX Auto-generated catch block
e.printStackTrace();
}
return language;
}
}
}
发生错误的新活动:
导入android.app.活动;导入android.os.捆绑包;
公共课概述扩展活动{
@在创建时覆盖受保护的无效(捆绑保存状态){super.on创建(保存状态);setContentView(findViewById(R.layout.splash));}
}
xml飞溅;
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@drawable/splash"
>
</LinearLayout>
编辑:我编辑了我的代码。现在使用AsyncWork,它似乎是像下面建议的豪华模式这样的解决方案,但它也不起作用。当setContentView...错误日志:
07-24 19:53:50.411: E/AndroidRuntime(29618): FATAL EXCEPTION: main
07-24 19:53:50.411: E/AndroidRuntime(29618): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hera.ontdekdelft/com.hera.ontdekdelft.Overview}: java.lang.NullPointerException
07-24 19:53:50.411: E/AndroidRuntime(29618): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2787)
07-24 19:53:50.411: E/AndroidRuntime(29618): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803)
07-24 19:53:50.411: E/AndroidRuntime(29618): at android.app.ActivityThread.access$2300(ActivityThread.java:135)
07-24 19:53:50.411: E/AndroidRuntime(29618): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136)
07-24 19:53:50.411: E/AndroidRuntime(29618): at android.os.Handler.dispatchMessage(Handler.java:99)
07-24 19:53:50.411: E/AndroidRuntime(29618): at android.os.Looper.loop(Looper.java:144)
07-24 19:53:50.411: E/AndroidRuntime(29618): at android.app.ActivityThread.main(ActivityThread.java:4937)
07-24 19:53:50.411: E/AndroidRuntime(29618): at java.lang.reflect.Method.invokeNative(Native Method)
07-24 19:53:50.411: E/AndroidRuntime(29618): at java.lang.reflect.Method.invoke(Method.java:521)
07-24 19:53:50.411: E/AndroidRuntime(29618): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
07-24 19:53:50.411: E/AndroidRuntime(29618): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
07-24 19:53:50.411: E/AndroidRuntime(29618): at dalvik.system.NativeStart.main(Native Method)
07-24 19:53:50.411: E/AndroidRuntime(29618): Caused by: java.lang.NullPointerException
07-24 19:53:50.411: E/AndroidRuntime(29618): at android.view.ViewGroup.addViewInner(ViewGroup.java:1977)
07-24 19:53:50.411: E/AndroidRuntime(29618): at android.view.ViewGroup.addView(ViewGroup.java:1873)
07-24 19:53:50.411: E/AndroidRuntime(29618): at android.view.ViewGroup.addView(ViewGroup.java:1853)
07-24 19:53:50.411: E/AndroidRuntime(29618): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:226)
07-24 19:53:50.411: E/AndroidRuntime(29618): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:216)
07-24 19:53:50.411: E/AndroidRuntime(29618): at android.app.Activity.setContentView(Activity.java:1665)
07-24 19:53:50.411: E/AndroidRuntime(29618): at com.hera.ontdekdelft.Overview.onCreate(Overview.java:12)
07-24 19:53:50.411: E/AndroidRuntime(29618): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069)
07-24 19:53:50.411: E/AndroidRuntime(29618): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751)
07-24 19:53:50.411: E/AndroidRuntime(29618): ... 11 more
setContentView(...)是一个活动的方法。你不能在你的Runnable
中调用它,它超出了范围。结果是空指针。
在Runnable中设置contentView的方法相当奇怪。。也许可以改变一下你的设计?也许你可以创建多个活动,而不是切换一个活动的布局。。
Android线程模型中有两条规则:1)不要阻止主(UI)线程2)不要在主(UI)线程之外操作UI。你似乎对第二条规则有意见。你可以尝试使用Activity#rununuithread(Runnable)而不是使用该处理程序,但一般来说,你所做的事情非常混乱,而且通常是一个糟糕的想法:)此外,除非我遗漏了什么,如果你在启动线程后初始化它,那么你的处理程序在启动线程内部到底有多可用?你似乎依赖于线程调度的某种方式,这也是一个坏主意。
很有可能,您需要使用的是一个AsyncWG
。立即在创建中设置内容视图,然后执行下载数据的AsyncWG
。然后在任务的后执行中,做任何必要的相关用户界面更改。
更新-
在onPostExecute中,请立即致电管理员。此外,不要通过调用starActive(new Intent(com.hera.ontdekdelft.OVERVIEW))启动您的活动;
,而应该是starActive(new Intent(Startup.this,Overview.class));
此外,从堆栈跟踪的外观来看,当您尝试启动新的活动时,崩溃正在发生。所以我会看看第12行,看看问题是什么。
更新-
正如我在下面的讨论中指出的:
您不能将活动的内容视图设置为findViewById(无论什么)。findViewById查看当前的内容视图,并试图找到与您传入的id相匹配的视图。但是你还没有设置任何内容视图,所以没有什么可找的。因此,当您尝试将内容视图设置为通过调用findViewById返回的空视图时,您会使用空指针崩溃!您需要将视图设置为该活动的任何视图。setContentView(R.layout.overview_layout)或setContentView(new Overview(this))
问题内容: 编辑: 看来我的按钮样式引起了问题。 编辑代码 出于某些原因,以上代码适用于4.2及更高版本。 将其放在这里供将来的人们使用。 当我尝试将方法调用到 布局 时,我的应用程序崩溃了。 我尝试了一些解决方案,当我删除按钮样式时,错误消失了。 看来我在按钮上使用的样式是造成这种情况的原因。 我的LogCat 问题答案: 从logcat出现的问题是Button的背景。我认为这是一个很大的形象,
我想用flex格式化FieldSet/legend,使legend位于FieldSet内容的左侧。我知道我可以这个图例,但在Safari14中,这不起作用。我怎样才能避开这个问题呢? null null
问题内容: 我正在开发一个程序,其中必须在Excel电子表格中设置单元格值 “这是带 下划线的 文本”。 可以是任何粗体,斜体或下划线。 我正在使用Apache POI 3.9 问题答案: 请尝试以下操作: 看起来像
我正在开发代表Surf WebScript的内容上传器。也许说updater更正确,因为内容已经存在于存储库中,但可能没有方面。我需要更新此内容并设置正确的版本号(例如,任意)。 我注意到第一次上传总是得到数字。 例如,假设内容模型没有特性。我可以通过这种方式添加它,并指定我需要的版本号(): 我使用的常量: 当我调试这个解决方案时,我可以看到我得到了我需要的版本。 然而,当我在节点浏览器中查看节
英文原文:http://emberjs.com/guides/views/built-in-views/ Ember中定义了一套用于构建一些非常基础的控件的视图,比如文本输入框、勾选框和选择列表。 这些视图有: Ember.Checkbox 1 2 3 4 <label> {{view Ember.Checkbox checked=model.isDone}} {{model.title
我有三个片段,第二个和第三个,在它们各自的布局中有一个listView。 换句话说,最初第二个片段和第三个片段的listView包含以下内容,其中CB:是检查框,IV:是ImageView,t是: text view,SaveButton是一个按钮 我想做的是,当我在第二个片段中,并“使用复选框”从listView中选择一个项目,然后单击“保存”按钮时,我选择的项目应该从第三个片段的listVie