显示java.lang.NullPointerException:尝试调用虚拟方法android.view.View .MainActivity.findViewById(INT)'对空对象引用 [英] java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View .MainActivity.findViewById(int)' on a null object reference
问题描述
我有一类叫做 MainActivity.java 调用一个的AsyncTask
类。最后一类具有 findViewById()
在执行这个错误:
显示java.lang.NullPointerException:尝试调用虚函数的空对象引用android.view.View< .MainActivity.findViewById(INT); mypackage的&GT
我不明白我怎么可以编辑的ImageView
位于 R.layout.activity_main
,一个后的AsyncTask
完成工作。
MainActivity.java
公共类MainActivity延伸活动{
公共MainActivity(){}
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main);
新的连接()执行();
}
}
Connection.java
公共类连接扩展的AsyncTask<字符串,太虚,字符串> {
公共字符串的结果;
//我知道,这是不正确的,我该怎么办?
公共MainActivity MainActivity;
@覆盖
保护字符串doInBackground(字符串...为arg0){
// TODO自动生成方法存根
// ...
返回字符串;
}
保护无效onPostExecute(字符串结果){
super.onPostExecute(结果);
// ...
//当生成错误
ImageView的形象=(ImageView的)MainActivity.findViewById(R.id.image);
// ...
}
}
该错误是
公共MainActivity MainActivity;
从未初始化,从而指向空。 为了让您的code正常工作的最低步骤是 在MainActivity
新的连接(本).execute();
在连接
公共类连接扩展的AsyncTask<字符串,太虚,字符串> {
公共MainActivity MainActivity;
公共连接(MainActivity活动){
MainActivity =活动;
}
但创造的onCreate任务,并通过一个活动是不是反正最好的主意。 此外,字段名应该总是以一个小写字母。
最好的办法是通过一个ImageView的到AsyncTask的。 不要启动任务,直到活动开始,也不要忘了取消时,活动停止的任务。
公开最后一类MainActivity延伸活动{
公共MainActivity(){}
专用连接的连接;
私人ImageView的ImageView的;
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main);
ImageView的=(ImageView的)findViewById(R.id.image);
}
@覆盖
保护无效的OnStart(){
super.onStart();
如果(连接== NULL || connection.getStatus()!= AsyncTask.Status.RUNNING){
连接=新的连接(ImageView的);
connection.execute();
}
}
@覆盖
保护无效的onStop(){
super.onStop();
如果(连接= NULL和放大器;!&安培; connection.getStatus()== AsyncTask.Status.RUNNING){
connection.cancel(真正的);
}
}
}
在Connection.java,存储一个ImageView的一个WeakReference的,防止泄漏。
公开最后一类连接扩展的AsyncTask<字符串,太虚,字符串> {
私人最终的WeakReference< ImageView的> imageViewRef;
公共连接(ImageView的视图){
imageViewRef =新的WeakReference< ImageView的>(视图);
}
@覆盖
保护字符串doInBackground(字符串...为arg0){
// TODO自动生成方法存根
// ...
返回字符串;
}
@覆盖
保护无效onPostExecute(字符串结果){
super.onPostExecute(结果);
// ...
最后的ImageView ImageView的= imageViewRef.get();
//如果活动还活着,ImageView的将不能为空
如果(ImageView的!= NULL){
//设置图像或任何你需要
image.setImageResource(666);
}
}
I have a class called MainActivity.java that call an AsyncTask
class. The last class have a findViewById()
that in execution return this error:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View <mypackage>.MainActivity.findViewById(int)' on a null object reference
I don't understand how can I edit an ImageView
positioned in R.layout.activity_main
after that an AsyncTask
finish to work.
MainActivity.java
public class MainActivity extends Activity {
public MainActivity() {}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Connection().execute();
}
}
Connection.java
public class Connection extends AsyncTask<String, Void, String> {
public String result;
//I know, this isn't correct, how can i do?
public MainActivity MainActivity;
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
//...
return "a string";
}
protected void onPostExecute(String result) {
super.onPostExecute(result);
//...
// Where the error is generated
ImageView image = (ImageView) MainActivity.findViewById(R.id.image);
//...
}
}
The error is that
public MainActivity MainActivity;
is never initialized, thus pointing to null. To make your code work the minimum step is in MainActivity
new Connection(this).execute();
In Connection
public class Connection extends AsyncTask<String, Void, String> {
public MainActivity MainActivity;
public Connection(MainActivity activity) {
MainActivity = activity;
}
But creating a task in onCreate and passing an Activity is not the best idea anyway. Also, field names should always start with a lowercase letter.
The best way is passing an ImageView to the AsyncTask. Don't start a task until the Activity is started and also, don't forget to cancel the task when the Activity is stopped.
public final class MainActivity extends Activity {
public MainActivity() {}
private Connection connection;
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.image);
}
@Override
protected void onStart() {
super.onStart();
if (connection == null || connection.getStatus() != AsyncTask.Status.RUNNING) {
connection = new Connection(imageView);
connection.execute();
}
}
@Override
protected void onStop() {
super.onStop();
if (connection != null && connection.getStatus() == AsyncTask.Status.RUNNING) {
connection.cancel(true);
}
}
}
In Connection.java, store an ImageView as a WeakReference to avoid leaks.
public final class Connection extends AsyncTask<String, Void, String> {
private final WeakReference<ImageView> imageViewRef;
public Connection(ImageView view) {
imageViewRef = new WeakReference<ImageView>(view);
}
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
//...
return "a string";
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
//...
final ImageView imageView = imageViewRef.get();
// if the Activity is still alive, the ImageView will not be null
if (imageView != null) {
// set an image or whatever you need
image.setImageResource(666);
}
}
这篇关于显示java.lang.NullPointerException:尝试调用虚拟方法android.view.View .MainActivity.findViewById(INT)'对空对象引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!