1

我正在尝试将网络中的图像存储到我的模拟器的 SD 卡中。但是,我更具体地期望空对象引用。

W/AQuery: reporting:java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.io.File.getAbsolutePath()' on a null object reference
                                         at testing.theo.androidqueryexample.MainActivity.handfile(MainActivity.java:69)
                                         at testing.theo.androidqueryexample.MainActivity.access$000(MainActivity.java:19)
                                         at testing.theo.androidqueryexample.MainActivity$1.callback(MainActivity.java:61)
                                         at testing.theo.androidqueryexample.MainActivity$1.callback(MainActivity.java:56)
                                         at com.androidquery.callback.AbstractAjaxCallback.callback(AbstractAjaxCallback.java:506)
                                         at com.androidquery.callback.AbstractAjaxCallback.afterWork(AbstractAjaxCallback.java:1299)
                                         at com.androidquery.callback.AbstractAjaxCallback.run(AbstractAjaxCallback.java:998)
                                         at android.os.Handler.handleCallback(Handler.java:739)
                                         at android.os.Handler.dispatchMessage(Handler.java:95)
                                         at android.os.Looper.loop(Looper.java:135)
                                         at android.app.ActivityThread.main(ActivityThread.java:5254)
                                         at java.lang.reflect.Method.invoke(Native Method)
                                         at java.lang.reflect.Method.invoke(Method.java:372)
                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

我的代码如下所示。

public class MainActivity extends AppCompatActivity {

AQuery aq;

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

    aq = new AQuery(this);

    /*Button b = (Button)findViewById(R.id.button);
    b.setText("new text");
    b.setBackgroundColor(Color.RED);
    b.setEnabled(true);*/

    aq.id(R.id.button).clicked(this, "clickhandle");
}

    public void clickhandle(View view){

        ProgressDialog pd = new ProgressDialog(this);
        pd.setTitle("Loading Image");
        pd.setMessage("Please wait...");
    aq.id(R.id.button).text("aquery text").backgroundColor(Color.RED).
            textColor(Color.YELLOW).enabled(true);
        //aq.id(R.id.imageView).progress(pd).image("http://static.panoramio.com/photos/large/127854802.jpg",true,true,0,0,null,AQuery.FADE_IN);

        File f = new File(Environment.getExternalStorageDirectory(),"myfiles/myimage.jpg");
        if(!f.exists())

        try {
            f.mkdirs();
            f.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        aq.download("http://static.panoramio.com/photos/large/127854802.jpg", f, new AjaxCallback<File>(){

                @Override
                public void callback(String url, File object, AjaxStatus status) {
                    super.callback(url, object, status);
                    handfile(object);
                }
            });


    }

        private void handfile(File object) {
            Toast.makeText(this,"got file: " +object.getAbsolutePath().toString(),Toast.LENGTH_LONG).show();
        }

}

第 69 行对应于 handlefile(...) 方法中的 Toast 消息。

有什么问题?

我在清单文件中声明了 WRITE_EXTERNAL_STORAGE 和 INTERNT 权限。

谢谢。

4

1 回答 1

1

我发现的问题是您myimage.jpg在目录中创建文件myfiles但该目录不存在。在创建文件之前尝试创建目录结构。

File f = new File f = new File(Environment.getExternalStorageDirectory(),"myfiles/myimage.jpg");

if(!f.exists())
    try {
        f.getParentFile().mkdirs(); //create missing parents
        f.createNewFile();
    } catch (IOException e) {
        e.printStackTrace();
    }

希望这可以帮助

于 2016-02-10T16:33:55.307 回答