getResources 中的 NullPointerException
Posted
技术标签:
【中文标题】getResources 中的 NullPointerException【英文标题】:NullPointerException in getResources 【发布时间】:2013-09-21 04:57:37 【问题描述】:我有活动和课程。在活动中我执行 HTTP GET 请求 (HttpClass.java),然后在 GetMethod.java 中执行 Asynctask。在 onPostExecute 函数中,我想返回活动并使用 JSON 解析数据。它可以工作,但是当我尝试以编程方式为每个数据数组项创建带有 textview 和按钮的布局时,它会抛出 NullPointerException。
代码:
HttpClass.java
@Override
protected void onCreate (Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.httplayout);
cont = this;
ll = (LinearLayout) findViewById(R.id.llHttp);
sv = (ScrollView) findViewById(R.id.svHttp);
//httptv = (TextView) findViewById(R.id.tvHttp);
font = Typeface.createFromAsset(getAssets(), "fontawesome-webfont.ttf");
font2 = Typeface.createFromAsset(getAssets(), "OpenSans-Regular.ttf");
GetMethod test = new GetMethod();
test.execute(new String[] "url");
public void getResultData(String result) throws Exception
// TODO Auto-generated method stub
resultdata = result;
JSONObject jObject;
jObject = new JSONObject(resultdata);
//JSONObject object = jObject.getJSONObject("pharms");
JSONArray jArray = jObject.getJSONArray("pharms");
for (int i = 0; i < jArray.length(); i++)
name = jArray.getJSONObject(i).getString("name").toString();
phone = jArray.getJSONObject(i).getString("phone").toString();
latitude = jArray.getJSONObject(i).getString("latitude").toString();
longitude = jArray.getJSONObject(i).getString("longitude").toString();
address = jArray.getJSONObject(i).getString("address").toString();
RelativeLayout ll2 = new RelativeLayout(cont);
//ll2.setOrientation(Orientation.ho)
Button call = new Button(cont);
call.setId(i+1);
call.setClickable(true);
call.setTypeface(font);
call.setText(R.string.call);
call.setTextColor(Color.rgb(0, 176, 128));
call.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
RelativeLayout.LayoutParams params1 = (RelativeLayout.LayoutParams)call.getLayoutParams();
params1.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params1.setMargins(0, 25, 0, 0);
call.setLayoutParams(params1);
call.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:123456789"));
startActivity(callIntent);
);
ll2.addView(call);
TextView tv = new TextView(cont);
tv.setId(i+1);
tv.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
RelativeLayout.LayoutParams params3 = (RelativeLayout.LayoutParams)tv.getLayoutParams();
params3.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params3.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
params3.setMargins(10, 25, 0, 0);
tv.setLayoutParams(params3);
tv.setText(name + "\n" + phone);
tv.setTextSize(20);
tv.setTypeface(font2);
tv.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
);
ll2.addView(tv);
ll.addView(ll2);
这是 GetMethod.java 类
@Override
protected String doInBackground(String... urls)
BufferedReader in = null;
String data = null;
for (String url : urls)
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
try
HttpResponse response = client.execute(request);
in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer sb = new StringBuffer("");
String l = "";
String nl = System.getProperty("line.separator");
while ((l = in.readLine()) != null)
sb.append(l + nl);
in.close();
data = sb.toString();
return data;
catch (Exception e)
e.printStackTrace();
return data;
@Override
protected void onPostExecute(String result)
HttpClass hc = new HttpClass();
try
hc.getResultData(result);
catch (Exception e)
// TODO Auto-generated catch block
e.printStackTrace();
编辑:LogCat 日志
09-17 01:35:53.955: W/System.err(18700): java.lang.NullPointerException
09-17 01:35:53.980: W/System.err(18700): at android.view.ViewConfiguration.get(ViewConfiguration.java:332)
09-17 01:35:53.980: W/System.err(18700): at android.view.View.<init>(View.java:3322)
09-17 01:35:53.980: W/System.err(18700): at android.view.ViewGroup.<init>(ViewGroup.java:421)
09-17 01:35:53.980: W/System.err(18700): at android.widget.RelativeLayout.<init>(RelativeLayout.java:180)
09-17 01:35:53.980: W/System.err(18700): at com.example.behealthy.HttpClass.getResultData(HttpClass.java:77)
09-17 01:35:53.980: W/System.err(18700): at com.example.behealthy.GetMethod.onPostExecute(GetMethod.java:44)
09-17 01:35:53.980: W/System.err(18700): at com.example.behealthy.GetMethod.onPostExecute(GetMethod.java:1)
09-17 01:35:53.980: W/System.err(18700): at android.os.AsyncTask.finish(AsyncTask.java:631)
09-17 01:35:53.980: W/System.err(18700): at android.os.AsyncTask.access$600(AsyncTask.java:177)
09-17 01:35:53.980: W/System.err(18700): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
09-17 01:35:53.980: W/System.err(18700): at android.os.Handler.dispatchMessage(Handler.java:99)
09-17 01:35:53.980: W/System.err(18700): at android.os.Looper.loop(Looper.java:137)
09-17 01:35:53.980: W/System.err(18700): at android.app.ActivityThread.main(ActivityThread.java:4898)
09-17 01:35:53.985: W/System.err(18700): at java.lang.reflect.Method.invokeNative(Native Method)
09-17 01:35:53.985: W/System.err(18700): at java.lang.reflect.Method.invoke(Method.java:511)
09-17 01:35:53.985: W/System.err(18700): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
09-17 01:35:53.985: W/System.err(18700): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
09-17 01:35:53.985: W/System.err(18700): at dalvik.system.NativeStart.main(Native Method)
【问题讨论】:
Logcat 说是 NullPointerException in RelativeLayout ll2 = new RelativeLayout(cont); 这不可能是NPE
出现的地方。但是,这可能是它的原因,请发布 logcat,以便我们可以看到它的确切位置。
什么是HttpClass
?您的 Activity
在您的方法所在的位置被称为 HttpActivity
。
对不起,打错了,activity被称为HttpClass。添加logcat日志
我认为可能是这样,它发生了。请参阅我提供的答案。这应该可以满足您的需求。
【参考方案1】:
像这样实例化 Activity
是错误的,这就是你得到 NPE
的原因
HttpClass hc = new HttpClass();
try
hc.getResultData(result);
这显然是一个单独的类,所以您要做的是创建一个interface
,以便在任务完成时进行回调。
This answer 给出了一个使用interface
和AsyncTask
的示例。
如果它是您的 Activity
的内部类,那么您可以直接从 onPostExecute()
调用该函数,但如果您需要它是一个单独的文件,那么您需要按照链接中的示例进行操作。
【讨论】:
它有效,谢谢。但是还有另一个问题。函数 call.onClick 未被调用。你能帮助我吗?还是我应该开始新话题? 嗯...不完全确定副手。你在那里设置了一个断点以确保它不会进入?我不确定您是否可以这样做,或者您是否需要通过执行call.setOnClickListener(this);
来设置onClick()
,然后将onClick()
放在方法之外。
这样一个简单的决定)将 onClick() 放在外面是有效的。谢谢!
不客气……很高兴它的工作,我们都学到了一些东西。这就是 SO 的魔力 :)以上是关于getResources 中的 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章
Android内存重启之静态变量被回收导致nullPoint问题
解决报错Failed to start bean ‘documentationPluginsBootstrapper‘; nested exception is java.lang.NullPoint
Android中ViewPager + Fragment使用ButterKnife注解时出现空指针NullPoint的情况