如何从其他类引用MainActivity中的任何对象?以及如何避免NullPointerException引用任何对象

时间:2016-12-13 15:34:52

标签: java android bitmap

onPostExecute() - NullPointerException:尝试在null对象引用上调用v.method' android.view.Window $ Callback android.view.Window.getCallback()'

空指针Exception(onPostExecute() - NullPointerException:尝试在set方法(MainActivity)或postExecute上调用v.method' android.view.Window $ Callback)  出现了methode(img load)。

  

我正在尝试加载图片并将其设置为mainactivity中的imageview。但我不能参考那个imageview。

     

我无法从imageload类引用该imageview,但我可以从mainactivity中的任何方法引用它。

这是MainActivity:

 //after your query regardless of outcome:
var_dump(mysqli_error($conn));

这里对set方法的引用为null,并且无法在ImageView的下面的类中获得引用。

这是Imageloader类:

public class MainActivity extends AppCompatActivity {

ImageView imageView;
Context context;

TextView textView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    imageView = (ImageView) findViewById(R.id.imageView);

    textView = (TextView) findViewById(R.id.textView);
}

    public void network(View view) {
        ConnectivityManager connMgr = (ConnectivityManager)
                getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {
            // fetch data
            Toast.makeText(this, "Network detected", Toast.LENGTH_SHORT).show();

            String stringUrl = "http://www.lorempixel.com/420/240/";
            new imgLoad().execute(stringUrl);

        } else {
            // display error

            Toast.makeText(this, "No network detected", Toast.LENGTH_SHORT).show();
//            textView.setText("No network connection available.");

        }


    }
public void set(Bitmap bitmap) {
    textView = (TextView) findViewById(R.id.textView);
    if (textView != null) {
        textView.setText("setting image..");
    }
    Toast.makeText(this, "setting..,", Toast.LENGTH_SHORT).show();

    if (imageView != null) {
        Toast.makeText(this, "good", Toast.LENGTH_SHORT).show();
        textView.setText("image not null..");

        imageView.setImageBitmap(bitmap);
    }else {
        textView.setText("null");
    }
}

这是Logcat:

public class imgLoad extends AsyncTask<String, Void, Bitmap> {


@Override
protected Bitmap doInBackground(String... params) {
    return load(params[0]);


}

@Override
protected void onPostExecute(Bitmap bitmap) {
    super.onPostExecute(bitmap);
    MainActivity m = new MainActivity();
//        ImageView c = m.x();
            m.set(bitmap);
//        Toast.makeText(MainActivity.getContext(), "downloaded", Toast.LENGTH_SHORT).show();
//        if (c!=null) {
//            c.setImageBitmap(bitmap);
//        }

}

private Bitmap load(String param) {
    Bitmap bitmap = null;
        InputStream inputStream;
        try {
            URL url = new URL(param);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("Get");
            httpURLConnection.setConnectTimeout(4000);
            httpURLConnection.setReadTimeout(2000);
            httpURLConnection.setDoInput(true);
            httpURLConnection.connect();
            inputStream = httpURLConnection.getInputStream();
            bitmap = BitmapFactory.decodeStream(inputStream);


        } catch (MalformedURLException e) {

            Log.e("error", "wrong url : " + e.getMessage());

//            e.printStackTrace();
            } catch (IOException e) {
//            e.printStackTrace();
            Log.e("error", "failed : " + e.getMessage());
        }
    return bitmap;
}
}

TIA。

1 个答案:

答案 0 :(得分:0)

让我们以适当的格式解决您的问题。运行应用程序时,您为MainActivity创建了一个对象。我们称之为mainActivityObject1。从mainActivityObject1开始,您为imgLoad课程创建了一个对象。在下载图像后,您为MainActivity创建了另一个对象(让我们称之为mainActivityObject2)。现在,您尝试调用方法mainActivityObject2.set(bitmap);,您应该在其中调用mainActivityObject1.set(bitmap);

你可以通过几种方式解决这个问题。但最基本的是传递活动背景。

在imgLoad类中创建一个构造函数,并像这样更改onPostExecute方法:

private MainActivity mainActivityContext;
public imgLoad(MainActivity passedActivityContext){
    this.mainActivityContext = passedActivityContext;
}
@Override
protected Bitmap doInBackground(String... params) {
    return load(params[0]);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
    super.onPostExecute(bitmap);
    mainActivityContext.set(bitmap);
}

当您实例化imgLoad时,从您的MainActivity类传递您的活动上下文,如下所示:

new imgLoad(MainActivity.this).execute(stringUrl);

现在当你从imgLoad类调用set(Bitmap bitmap)时,它应该调用创建imgLoad对象的原始MainActivity对象。

注意:

  

我还注意到你没有在你在这里发布的MainActivity类中调用network方法。请将其称为正确测试。