代码之家  ›  专栏  ›  技术社区  ›  Paresh Mayani jeet

Android-获取异常

  •  1
  • Paresh Mayani jeet  · 技术社区  · 14 年前

    我正在开发一个应用程序,在这个应用程序中我得到了一个例外,我知道这是我正在做的愚蠢或小错误,但您的帮助可能会使我陷入困境,并使我的一天:

    公共类demo扩展活动 { 按钮BTNDEMO; 线程T; AlertDialog警报对话框; @重写 public void oncreate(bundle savedinstanceState){ super.oncreate(保存的状态); setContentView(r.layout.demo); btndemo=(button)findViewByID(r.id.btndemo); btndemo.setonclickListener(new onclickListener()){ 公共void onclick(最终视图V){ T=新线程()。{ public void run()。{ TrimeDo(); } }; 启动(); } (}); } 公共void trydemo() { 尝试 { int i=5; 如果(i==0 i==1) { intent intent_success=new intent(getApplicationContext(),main_activity.class); 开始活动(意图成功); } 其他的 { alertDialog=new alertDialog.builder(getApplicationContext()).create(); alertDialog.settitle(“演示”); alertDialog.setButton(“确定”,new dialogInterface.onclickListener()。{ public void onclick(dialoginterface dialog,int which){ //在这里可以添加函数 }); alertdialog.seticon(r.drawable.icon); alertDialog.setMessage(“抱歉!!用户名或密码无效);; alertDialog.show(); } } catch(异常E) { log.i(“demo”,“demo-demo异常”); } } } < /代码>

    在上面的代码中,如果我在Trydemo函数中使i=0或i=1,那么它将成功运行,但是如果我使它不是0或1,那么它将抛出一个异常作为“demo-demo exception”。

    我不确定,但我认为异常是由 GetApplicationContext()引起的。

    更新:-1

    我得到的例外情况如下:

    update:-2 如果我删除了“线程”部分,并在button click事件中编写了整个函数代码,并用v.getContext()替换了“getApplicationContext()”,那么它将成功运行………但是我想在线程中实现它。

    请帮帮我,把我赶出去…

    P<例外,我知道这是我犯的一个愚蠢或小错误,但你的帮助可能会把我赶出去,让我度过一天:

    public class Demo extends Activity
    {
        Button btnDemo;
            Thread t;
        AlertDialog alertDialog;
    
         @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.demo);
    
                  btnDemo = (Button) findViewById(R.id.btnDemo);
              btnDemo.setOnClickListener(new OnClickListener() {
                          public void onClick(final View v) {
    
                              t=new Thread() {
                                   public void run() {
                                        tryDemo();
                                   }
                             };
                             t.start(); 
                          }
                    });
         }
    
        public void tryDemo()
        {
    
              try
             {
                  int i = 5;
    
                  if(i == 0 || i == 1)
                  {
                        Intent intent_success = new Intent(getApplicationContext(), Main_Activity.class);
                        startActivity(intent_success);
                  }
                  else
                  {
                    alertDialog = new  AlertDialog.Builder(getApplicationContext()).create();
                    alertDialog.setTitle("Demo");
                    alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                       public void onClick(DialogInterface dialog, int which) {
                           //here you can add functions
                    } }); 
                    alertDialog.setIcon(R.drawable.icon);
                    alertDialog.setMessage("Sorry!! Either Username or Password Invalid");
                    alertDialog.show();
    
                  }
             }
             catch(Exception e)
             {
                   Log.i("Demo", "Demo - Demo Exception");
             }
        }   
    }
    

    在上面的代码中,如果我在Trydemo函数中使i=0或i=1,那么它将成功运行,但是如果我使它不是0或1,那么它将 将异常作为“演示-演示异常”引发 .

    我不确定,但我认为例外情况是从 获取应用程序上下文() .

    更新:- 1

    我得到的例外情况如下:

    alt text

    更新:- 2 如果我删除了“线程”部分,并在button click事件中编写了整个函数代码,并用v.getContext()替换了“getApplicationContext()”,那么它将成功运行………但我希望在线程中实现它。

    请帮我把我抓出来…

    桑克斯

    4 回复  |  直到 14 年前
        1
  •  1
  •   LordTwaroog    14 年前

    只需阅读日志:d您还没有调用lopper.prepare()。

    如果我是正确的,您应该用looper.prepare()和looper.loop()包装AlertDialog代码。

    所以看起来:

    Looper.prepare()
    // AlertDialog code
    Looper.loop()
    
        2
  •  1
  •   Key    14 年前

    你可能得到一个 RuntimeException . 我尝试在不是用户界面线程的线程中调用一些对话框创建,得到了:

    09-09 00:46:37.702: ERROR/AndroidRuntime(763): Uncaught handler: thread Thread-10 exiting due to uncaught exception
    09-09 00:46:37.724: ERROR/AndroidRuntime(763): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    09-09 00:46:37.724: ERROR/AndroidRuntime(763):     at android.os.Handler.<init>(Handler.java:121)
    09-09 00:46:37.724: ERROR/AndroidRuntime(763):     at android.view.ViewRoot.<init>(ViewRoot.java:192)
    09-09 00:46:37.724: ERROR/AndroidRuntime(763):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
    09-09 00:46:37.724: ERROR/AndroidRuntime(763):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
    09-09 00:46:37.724: ERROR/AndroidRuntime(763):     at android.view.Window$LocalWindowManager.addView(Window.java:392)
    09-09 00:46:37.724: ERROR/AndroidRuntime(763):     at android.app.Dialog.show(Dialog.java:231)
    09-09 00:46:37.724: ERROR/AndroidRuntime(763):     at com.pkg.name.ToplistActivity$3.run(ToplistActivity.java:149)
    

    解决方案是将else语句包装为:

    else {
        runOnUiThread(new Runnable() {
            public void run() {
                ...
            }
        });
    }
    
        3
  •  1
  •   Community davidgyoung    7 年前

    此日志中的签出注释:

    Using Application context everywhere?

    另外,如果用actiiivtyname.getApplicationContext()替换getApplicationContext(),您会得到什么错误?

        4
  •  1
  •   Miguel Morales    14 年前

    这有点问题。 首先,您永远不会接触到您创建的任何线程中的任何UI元素。

    您需要使用线程处理程序进行水化处理: http://developer.android.com/reference/android/os/Handler.html

    它们的工作方式是,在正常的UI线程中初始化它们。(调用onCreate()方法的线程。) 处理程序是线程安全的对象,可以扩展到线程之间的通信。

    所以,在onCreate()上:

    Handler pHandler = new Handler()
        {
            @Override
            public void handleMessage(Message msg)
            {
                Bundle bundle = msg.getData();
                int msg_type = bundle.getInt("TYPE");
                if (msg_type == MyThread.ERROR_MSG)
                {
                     ///SOMETHING HAPPENED
                     return;
                }
                else
                {
                    //background task finished ok
                }
            }
        };
    

    然后,通过run()方法,使用bundle和message对象向它发送消息。 http://developer.android.com/reference/android/os/Bundle.html http://developer.android.com/reference/android/os/Message.html

    我喜欢这样做,保持事情干净的方法是扩展线程类以添加一点一致性…

    class MyThead extends Thread
    {
        public final int ERROR_MSG = 0;
        public final int OK_MSG = 1;
        Handler mHandler;
    
        MyThread(Handler pHandler)
        {
            mHandler = pHandler;
        }
    
        @Override
        public void run()
        {
            //send a message back to the ui thread....
            Message msg = new Message();
            Bundle bundle = new Bundle();
            bundle.putInt("TYPE", OK_MSG);
            msg.setData(bundle);
            mHandler.sendMessage(msg);
        }
    }
    

    如果您想稍微花哨一点,可以将UI代码和工作线程代码完全分开。 如果您的后台任务不会花费很长时间,那么您可以像前面描述的那样运行onWithRead()。

    您可能还希望使用AsyncTask,请参见: http://developer.android.com/reference/android/os/AsyncTask.html

    以下是他们页面中的一个示例,其用法相当简单:

    private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
         protected Long doInBackground(URL... urls) {
             int count = urls.length;
             long totalSize = 0;
             for (int i = 0; i < count; i++) {
                 totalSize += Downloader.downloadFile(urls[i]);
                 publishProgress((int) ((i / (float) count) * 100));
             }
             return totalSize;
         }
    
         protected void onProgressUpdate(Integer... progress) {
             setProgressPercent(progress[0]);
         }
    
         protected void onPostExecute(Long result) {
             showDialog("Downloaded " + result + " bytes");
         }
     }
    

    但最终,如果用户在任务运行时改变方向,这些方法并不完美。(或者如果您的活动因任何其他原因而死亡。) 在这种情况下,您需要设置一个服务: http://developer.android.com/reference/android/app/Service.html