【问题标题】:App crashed when save button is clicked单击保存按钮时应用程序崩溃
【发布时间】:2016-01-16 11:38:21
【问题描述】:

我想知道是否可以更新图像路径和图像 文件夹?

我已经成功将图片路径和文字从android存入MySQL,并将图片保存在一个目录中。

上传图片的php

<?php
    if( $_SERVER['REQUEST_METHOD']=='POST' ){
        if( !empty( $_POST['listItems'] ) ){
            $listItems = json_decode( $_POST['listItems'], true ); 
            $mysqli = new mysqli("127.0.0.1:3307", "root", "", "androiddb");
            if( $mysqli->connect_errno ) echo "Failed to connect to MySQL";
            $sql="INSERT INTO `staff_benefit` 
                 ( `type`, `amount`, `description`, `image`, `ts_id` ) 
                  VALUES ( ?, ?, ?, ?, ? )";
            if($stmt=$mysqli->prepare($sql )){
                $url="http://192.168.1.7:80/Android/CRUD/PhotoUpload/";
                foreach( $listItems as $item ){ 
                    $id = uniqid();
                    $image_name = $id.".png";
                    $save_path = 'PhotoUpload/'.$image_name;
                    $image_url = $url.$image_name;
                    $bytes=file_put_contents($save_path, base64_decode($item['image']));
                    if( !$bytes ){
                        echo 'Error saving image';  
                    }else{
                        $stmt->bind_param('sssss', 
                        $item['type'], 
                        $item['amount'], 
                        $item['description'], 
                        $image_url, 
                        $item['ts_id'] );
                        if( !$res=$stmt->execute()){ 
                            echo 'Query failed with code: '.$stmt->errno;
                        }
                    }
                } 
            }
            $mysqli->close();
        }
    }
?>

Edit_Staff_Benefit_ListView中,将检索两行数据并加载到listView。当列表被点击时,它会意图 Edit_Staff 进行编辑。

Edit_Staff_Benefit_ListView

 listViewEdit.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> listView, View view,
                                    int position, long id) {
                mClickedPosition = position; // update
                long i1d = staffs.get(position).getId();
                Intent intent = new Intent(getActivity(), Edit_Staff.class);
                intent.putExtra("id", i1d);
                intent.putExtra("ID", ID);  // this is ts_id
                intent.putExtra("mClickedPosition", mClickedPosition);
                startActivityForResult(intent, PROJECT_REQUEST_CODE);
            }
        });

Edit_Staff

  mClickedPosition=getIntent().getIntExtra("mClickedPosition",-1);
            ID = getIntent().getLongExtra("id", 0);
            IDFromInfo=getIntent().getStringExtra("ID");
            Toast.makeText(getApplicationContext(), "ID" + ID+"FK"+IDFromInfo , Toast.LENGTH_LONG).show();
            if (getIntent().getExtras() != null) {
                RetrieveDetails(ID);  // retrieve all the data based on position in listView
            }


  save.setOnClickListener(new View.OnClickListener() {     // if save button clicked
            @Override
            public void onClick(View v) {
                Intent returnIntent = new Intent();
                claimType = spinnerType.getSelectedItem().toString();
                Description = description.getText().toString();
                Amount = amount.getText().toString();
                if(mClickedPosition==-1)
                {
                 //Add(claimType,Amount,Description,photo);
                }
                else
                {
                    update(claimType,Amount,Description,photo);
                }

            }
        });

更新功能

 public void update( final String claimType,  final String Amount, final String Description, final Uri photo)
    {
           class updateImageAndText extends AsyncTask<Void,Void,String>{
               ProgressDialog loading;
               @Override
               protected void onPreExecute() {
                   super.onPreExecute();
                   loading = ProgressDialog.show(Edit_Staff.this,"Updating...","Wait...",false,false);
               }

               @Override
               protected void onPostExecute(String s) {
                   super.onPostExecute(s);
                   loading.dismiss();
                   Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG).show();
                   try {
                       Intent returnIntent = new Intent();
                       returnIntent.putExtra("ClaimType", claimType);
                       returnIntent.putExtra("Amount", Amount);
                       returnIntent.putExtra("Description", Description);
                       returnIntent.putExtra("photo", photo);
                       setResult(Activity.RESULT_OK, returnIntent);
                       finish();
                   }catch(Exception e)
                   {

                   }
               }

               @Override
               protected String doInBackground(Void... params) {
                   HashMap<String,String> hashMap = new HashMap<>();
                   hashMap.put(Configs.KEY_ID,String.valueOf(ID));
                   hashMap.put(Configs.KEY_TYPE,claimType);
                   hashMap.put(Configs.KEY_AMOUNT,Amount);
                   hashMap.put(Configs.KEY_DESCRIPTION,Description);
                   hashMap.put(Configs.KEY_IMAGE,photo.toString());
                   RequestHandler rh = new RequestHandler();
                   String s = rh.sendPostRequest(Configs.URL_UPDATEDE_IMAGE_TEXT,hashMap);
                   return s;
               }
           }

Update.php

<?php 
    if($_SERVER['REQUEST_METHOD']=='POST'){
        //Getting values 

        $id = $_POST['id'];
        $type = $_POST['type'];
        $amount = $_POST['amount'];
        $description = $_POST['description'];
        $image = $_POST['image'];


        //importing database connection script 
        require_once('dbConnect.php');


        $sql = "UPDATE staff_benefit 
                  SET type = '$type', amount = '$amount', description='description', image='image' 
                WHERE id = '$id'";

        //Updating database table 
        if(mysqli_query($con,$sql)){
            echo ' Updated Successfully';
        }else{

            echo mysqli_error($con);
            exit;
        }

        //closing connection 
        mysqli_close($con);
    }
?>

单击保存按钮时应用程序崩溃。是因为我写了一个错误的更新。 php?谢谢

LogCat

01-16 19:36:51.373  22786-22786/com.example.project.myapplication E/WindowManager﹕ android.view.WindowLeaked: Activity com.example.project.myapplication.GUI.Edit_Staff has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{42c71d80 V.E..... R......D 0,0-684,324} that was originally added here
            at android.view.ViewRootImpl.<init>(ViewRootImpl.java:467)
            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:267)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
            at android.app.Dialog.show(Dialog.java:289)
            at android.app.ProgressDialog.show(ProgressDialog.java:116)
            at android.app.ProgressDialog.show(ProgressDialog.java:104)
            at com.example.project.myapplication.GUI.Edit_Staff$1updateImageAndText.onPreExecute(Edit_Staff.java:154)
            at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
            at android.os.AsyncTask.execute(AsyncTask.java:535)
            at com.example.project.myapplication.GUI.Edit_Staff.update(Edit_Staff.java:191)
            at com.example.project.myapplication.GUI.Edit_Staff$1.onClick(Edit_Staff.java:103)

【问题讨论】:

标签: php android mysql image


【解决方案1】:

@Tony 当您收到此错误时,表示您的窗口正在泄漏进度对话框。

当您不取消它时会发生这种情况,这是因为您的应用在此之前崩溃了。

要查看真正的错误,请删除 ProgressDialog loading; 以便调试。

您还有逻辑问题,您的代码应检查是否已选择图像并将其添加到您的hashmap

如果Uri 没有被初始化并且你没有检查你是否会得到nullpointerException

您还需要像在旧问题中那样发送以 Base64 编码的图像。 uri 是设备上您需要进行编码的文件的路径,但它不会插入到您的表格中。您需要重新上传新图像。

您的 PHP 脚本应该检查正在传递的参数。如果照片没有更改,请不要更新该字段,您可以检查$_POST['image'] 如果未设置,则运行不带图像列的UPDATE 查询。

【讨论】:

    【解决方案2】:

    您试图在退出 Activity 后显示一个对话框。

    他的错误在某些情况下可能有点误导(尽管答案仍然完全准确) - 即在我的情况下,在 AsyncTask 中引发了未处理的异常,导致 Activity 关闭,然后打开的进度对话框导致此异常.. 所以“真正的”异常在日志中稍早一些。

    在退出 Activity 之前在您创建的 Dialog 上调用 dismiss(),例如在 onPause() 或 onDestroy() 中。

    原来回复HERE

    【讨论】:

    • 我该如何解决这个问题?我应该在哪里调用dismiss()?
    • 执行此加载 = new ProgressDialog.show(Edit_Staff.this,"Updating...","Wait...",false,false);
    • 尝试删除你的onPreExecute,看看发生了什么。并删除完成();来自 jour try/catch 块。
    • 01-16 21:04:33.818 6041-6368/com.example.project.myapplicationE/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1 Process: com.example.project.myapplication, PID: 6041 java.lang.RuntimeException: An error occured while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:300)
    • 错误指向hashMap.put(Configs.KEY_IMAGE,photo.toString());
    猜你喜欢
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多