2012-12-12 38 views
0

我正在实现一个android应用程序。我的问题没有智能,当我从客户端发送数据到服务器时,我希望客户端知道数据已成功发送。我已经实现了一个AlertDialog,但是当我发送数据时,我收到一条消息“无法在未调用Looper.prepare()的线程中创建处理程序”。下面附上了我的代码。AlertDialog不按预期工作

private void saveOrder(final Order order) { 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
      try { 
       getConnection().saveOrder(order); 
       handleSuccessSaveOrder(); 
      } 
      catch (Exception exc) { 
       Log.d("--- ERROR ---", exc.getMessage()); 
       handleException(exc.getMessage()); 
      } 
     } 
    }); 
    thread.start(); 
} 

private void handleSuccessSaveOrder() { 
    showAlert(Farsi.Convert(" j "),R.drawable.warning); 
    //showActivity(MainMenuActivity.class); 
} 

private void showAlert(String message, int iconId) { 
    alert = new AlertDialog.Builder(ReviewOrderActivity.this); 
    alert.setTitle("Status Dialog"); 
    alert.setMessage(message); 
    alert.setIcon(iconId); 

     alert.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface arg0, int arg1) { 
     showActivity(MainMenuActivity.class); } }); 


    alert.show(); 

} 

回答

3

你不能从backgroung线程更改UI。 使用这样

private void handleSuccessSaveOrder() { 
ReviewOrderActivity.this.runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       showAlert(Farsi.Convert(" j "),R.drawable.warning); 

      } 
     }); 

    //showActivity(MainMenuActivity.class); 
} 
4

你不能从一个非UI线程修改UI,使用runOnUiThread

private void saveOrder(final Order order) { 
    Thread thread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
     try { 
      getConnection().saveOrder(order); 
      runOnUiThread(new Runnable() { 
       public void run() { 
        handleSuccessSaveOrder(); 
       } 
      }); 

     } 
     catch (Exception exc) { 
      Log.d("--- ERROR ---", exc.getMessage()); 
      handleException(exc.getMessage()); 
     } 
    } 
}); 
thread.start(); 
} 
1

“不能内螺纹已不叫Looper.prepare创建处理器() “归因于:

当在后台线程中运行进程时,无法在UI线程中显示Alert dialog

所以,放在UI线程警告对话框中您handleSuccessSaveOrder()如下:

this.runOnUiThread(new Runnable() { 
        public void run() { 
         showAlert(Farsi.Convert(" j "),R.drawable.warning); 
        } 
       }); 
2

让处理器的显示AlertDialog和尝试下面的代码,而不是你上面的代码,它会解决你的问题。

private void saveOrder(final Order order) { 
    Thread thread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       getConnection().saveOrder(order); 
       mHandler.sendEmptyMessage(0); 
      } 
      catch (Exception exc) { 
       Log.d("--- ERROR ---", exc.getMessage()); 
       handleException(exc.getMessage()); 
      } 
     } 
    }); 
    thread.start(); 
} 

public Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     handleSuccessSaveOrder(); 
    } 
}; 

private void handleSuccessSaveOrder() { 
    showAlert(Farsi.Convert(" j "),R.drawable.warning); 
} 

private void showAlert(String message, int iconId) { 
    alert = new AlertDialog.Builder(ReviewOrderActivity.this); 
    alert.setTitle("Status Dialog"); 
    alert.setMessage(message); 
    alert.setIcon(iconId); 

    alert.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface arg0, int arg1) { 
      showActivity(MainMenuActivity.class); 
     } 
    }); 

    alert.show(); 

}