Android应用程序在真实设备上的调试

Android应用程序在真实设备上的调试,android,Android,我正在一台真正的设备上测试我的上一个android应用程序,它在第二个屏幕上崩溃了 在模拟器上测试,效果良好 这是崩溃时的调试消息 欢迎提供任何帮助,以了解从何处开始解决该问题 10-22 21:31:09.364: E/WindowManager(31009): android.view.WindowLeaked: Activity com.solinpromex.casajuventudtrescantos.Cursos_MainActivity has leaked window com.

我正在一台真正的设备上测试我的上一个android应用程序,它在第二个屏幕上崩溃了

在模拟器上测试,效果良好

这是崩溃时的调试消息

欢迎提供任何帮助,以了解从何处开始解决该问题

10-22 21:31:09.364: E/WindowManager(31009): android.view.WindowLeaked: Activity com.solinpromex.casajuventudtrescantos.Cursos_MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{456e0908 V.E..... R......D 0,0-580,163} that was originally added here
10-22 21:31:09.364: E/WindowManager(31009):     at android.view.ViewRootImpl.<init>(ViewRootImpl.java:468)
10-22 21:31:09.364: E/WindowManager(31009):     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:267)
10-22 21:31:09.364: E/WindowManager(31009):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
10-22 21:31:09.364: E/WindowManager(31009):     at android.app.Dialog.show(Dialog.java:289)
10-22 21:31:09.364: E/WindowManager(31009):     at com.solinpromex.casajuventudtrescantos.Cursos_MainActivity$DownloadJSON.onPreExecute(Cursos_MainActivity.java:77)
10-22 21:31:09.364: E/WindowManager(31009):     at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
10-22 21:31:09.364: E/WindowManager(31009):     at android.os.AsyncTask.execute(AsyncTask.java:535)
10-22 21:31:09.364: E/WindowManager(31009):     at com.solinpromex.casajuventudtrescantos.Cursos_MainActivity.onResume(Cursos_MainActivity.java:145)
10-22 21:31:09.364: E/WindowManager(31009):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1198)
10-22 21:31:09.364: E/WindowManager(31009):     at android.app.Activity.performResume(Activity.java:5538)
10-22 21:31:09.364: E/WindowManager(31009):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3053)
10-22 21:31:09.364: E/WindowManager(31009):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3092)
10-22 21:31:09.364: E/WindowManager(31009):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2463)
10-22 21:31:09.364: E/WindowManager(31009):     at android.app.ActivityThread.access$900(ActivityThread.java:172)
10-22 21:31:09.364: E/WindowManager(31009):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1305)
10-22 21:31:09.364: E/WindowManager(31009):     at android.os.Handler.dispatchMessage(Handler.java:102)
10-22 21:31:09.364: E/WindowManager(31009):     at android.os.Looper.loop(Looper.java:146)
10-22 21:31:09.364: E/WindowManager(31009):     at android.app.ActivityThread.main(ActivityThread.java:5598)
10-22 21:31:09.364: E/WindowManager(31009):     at java.lang.reflect.Method.invokeNative(Native Method)
10-22 21:31:09.364: E/WindowManager(31009):     at java.lang.reflect.Method.invoke(Method.java:515)
10-22 21:31:09.364: E/WindowManager(31009):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
10-22 21:31:09.364: E/WindowManager(31009):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
10-22 21:31:09.364: E/WindowManager(31009):     at dalvik.system.NativeStart.main(Native Method)
添加了活动Cursos\u main活动

package com.solinpromex.casajuventudtrescantos;

import java.util.ArrayList;
import java.util.HashMap;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;

public class Cursos_MainActivity extends Activity {
    // Declare Variables


    JSONObject jsonobject;
    JSONArray jsonarray;
    ListView listview;
    Cursos_ListViewAdapter adapter;
    ProgressDialog mProgressDialog;
    ArrayList<HashMap<String, String>> arraylist;

    static String VALORACIONARTESANO = "valoracionArtesano";
    static String NOMBREARTESANO = "nombreArtesano";
    static String DIRECCIONARTESANO = "direccionArtesano";
    static String LOGOARTESANO = "logoArtesano";
    static String TELEFONOARTESANO = "telefonoArtesano";
    static String FACEBOOKARTESANO = "facebookArtesano";
    static String EMAILARTESANO = "emailArtesano";
    static String TEXTARTESANO = "textArtesano";
    static String LATITUD = "latitud";
    static String LONGITUD = "longitud";
    static String IDARTESANO = "idArtesano";
    static String CIUDAD = "ciudad";
    static String CP = "cp";
    static String WEB = "web";



    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.v("MVASCO", "context is null!");
         // getting intent data
        Intent in = getIntent();
     // JSON node keys



        this.setTitle("Zona Cultura");
        // Get the view from listview_main.xml
        setContentView(R.layout.cursos_listview_main);
        // Execute DownloadJSON AsyncTask
        //new DownloadJSON().execute();
    }

    // DownloadJSON AsyncTask
    private class DownloadJSON extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Create a progressdialog
            mProgressDialog = new ProgressDialog(Cursos_MainActivity.this);
            // Set progressdialog title
            mProgressDialog.setTitle("Casa de la Juventud");
            // Set progressdialog message
            mProgressDialog.setMessage("Zona Cultura");
            mProgressDialog.setIndeterminate(false);
            // Show progressdialog
            mProgressDialog.show();
        }

        @Override
        protected Void doInBackground(Void... params) {
            // Create an array
            arraylist = new ArrayList<HashMap<String, String>>();
            // Retrieve JSON Objects from the given URL address
            jsonobject = JSONfunctions
                    .getJSONfromURL("http://www.solinpromex.com/casajuventud/android/android_centros.php");

            try {
                // Locate the array name in JSON
                jsonarray = jsonobject.getJSONArray("Categorias");

                for (int i = 0; i < jsonarray.length(); i++) {
                    HashMap<String, String> map = new HashMap<String, String>();
                    jsonobject = jsonarray.getJSONObject(i);
                    // Retrive JSON Objects
                    String codpostal = jsonobject.getString("cp_zonacultura");
                    map.put("valoracionArtesano", jsonobject.getString("valoracion_zonacultura"));
                    map.put("nombreArtesano", jsonobject.getString("nombre_zonacultura"));
                    map.put("direccionArtesano", jsonobject.getString("direccion_zonacultura"));
                    map.put("logoArtesano", jsonobject.getString("imagen_zonacultura"));
                    map.put("telefonoArtesano", jsonobject.getString("tel_zonacultura"));
                    map.put("emailArtesano", jsonobject.getString("email_zonacultura"));
                    map.put("textArtesano", jsonobject.getString("desc_zonacultura"));
                    map.put("facebookArtesano", jsonobject.getString("facebook_zonacultura"));
                    map.put("latitud", jsonobject.getString("latitud_zonacultura"));
                    map.put("longitud", jsonobject.getString("longitud_zonacultura"));
                    map.put("idArtesano", jsonobject.getString("id_zonacultura"));
                    map.put("ciudad", codpostal+" "+jsonobject.getString("ciudad_zonacultura"));
                    map.put("cp", jsonobject.getString("cp_zonacultura"));
                    map.put("web", jsonobject.getString("web_zonacultura"));




Log.d("NOMBRE DEL SITIO ", "Value: " + (jsonobject.getString("nombre_zonacultura")));

                    // Set the JSON Objects into the array
                    arraylist.add(map);
                }
            } catch (JSONException e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void args) {
            // Locate the listview in listview_main.xml
            listview = (ListView) findViewById(R.id.listview);
            // Pass the results into ListViewAdapter.java
            adapter = new Cursos_ListViewAdapter(Cursos_MainActivity.this, arraylist);
            // Set the adapter to the ListView
            listview.setAdapter(adapter);

            // Close the progressdialog
            mProgressDialog.dismiss();
        }
    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        new DownloadJSON().execute();
    }

}

您的mProgressDialog正在泄漏内存

试试这个

mProgressDialog = new ProgressDialog(this.getApplicationContext());

我认为问题在于:

adapter = new Cursos_ListViewAdapter(Cursos_MainActivity.this, arraylist);
        // Set the adapter to the ListView
        listview.setAdapter(adapter);
我不知道适配器中有什么,但通常您在那里处理的是视图

不要忘记onPostExecute仍然在另一个线程中,并且您正在尝试使用来自主线程/活动的视图

对于这样的事情,最好的解决方案是将某个接口传递给AsyncTask,完成后,AsyncTask将数据传递回活动


这也更接近于。异步任务应获取数据并将其传递。适配器将显示接收到的数据。

看起来您可能不正确地在对话框代码中或周围保留了对某些内容的引用。@AnikIslamAbhi,活动代码已附加到我的问题中。谢谢。@ChrisStratton,活动代码已经附在我的问题后面了。谢谢。@AnikIslamAbhi,对不起,你是对的,当试图打开活动Cursos_MainActivity时,它会崩溃。代码被添加到问题中。谢谢。我怀疑问题与挂起对话框窗口,并可能试图在不适当的时间使用它有关-如果在异步任务运行时,即在onPostExecute之前,活动暂停,该怎么办?您可以在onPause中关闭并取消对话框,只有在onPostExecute中尝试关闭非空且显示的对话框。谢谢,但我已删除了所有progressdialog行,应用程序再次崩溃。如果它再次崩溃,您的日志将很有帮助。
adapter = new Cursos_ListViewAdapter(Cursos_MainActivity.this, arraylist);
        // Set the adapter to the ListView
        listview.setAdapter(adapter);