2012-06-29 89 views
0

在我的活動中,有一個切換按鈕。我希望每次更改切換按鈕以取消選中對話框時,當您按下是時,就會在Facebook的牆上發佈一條消息。無法在未調用Looper.prepare()的線程內創建處理程序 - 對話框內的AsyncTask

我把代碼在Facebook上發佈沒有Facebook的對話框這裏https://stackoverflow.com/a/4376415/1403979

這裏是我的代碼:

OnCheckedChangeListener toggleButtonListener = new OnCheckedChangeListener() { 
    // called when user toggles session state 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, 
      boolean isChecked) { 
      if (!isChecked) { 
      AlertDialog.Builder builder = new AlertDialog.Builder(
        SocialFootActivity.this); 
      builder.setMessage(
        "Do you want to share on facebook") 
        .setCancelable(false) 
        .setPositiveButton("Yes", 
          new DialogInterface.OnClickListener() { 
           public void onClick(DialogInterface dialog, 
             int id) {   
            SocialFootActivity.this.runOnUiThread(new Runnable() { 
             @Override 
             public void run() { 
            new PostMsg().execute("Hello World"); 
             }}); 
           } 
          }) 
        .setNegativeButton("No", 
          new DialogInterface.OnClickListener() { 
           public void onClick(DialogInterface dialog, 
             int id) { 
            dialog.cancel(); 
           } 
          }); 
      AlertDialog alert = builder.create(); 
      alert.show(); 

     } else { 
      //do somethings 
     } 
    } 
}; 

的AsyncTask

public class PostMsg extends AsyncTask<String,Void,Void>{ 

@Override 
protected Void doInBackground(String... msg) { 
    // TODO Auto-generated method stub 
    try { 
     SocialFootActivity sf = new SocialFootActivity(); 
     String response = sf.facebook.request("me"); 
     Bundle parameters = new Bundle(); 
     parameters.putString("message", msg[0]); 
     parameters.putString("description", "test test test"); 
     response = sf.facebook.request("me/feed", parameters, "POST"); 
     Log.d("Tests", "got response: " + response); 
     if (response == null || response.equals("") 
       || response.equals("false")) { 
      Log.v("Error", "Blank response"); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

} 

編輯:logcat的

06-29 17:37:19.055: W/System.err(24427): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
06-29 17:37:19.155: D/dalvikvm(24427): GC_CONCURRENT freed 1080K, 25% free 6038K/8003K, paused 2ms+5ms 
06-29 17:37:19.175: W/CursorWrapperInner(24427): Cursor finalized without prior close() 
06-29 17:37:19.175: W/System.err(24427): at android.os.Handler.<init>(Handler.java:121) 
06-29 17:37:19.175: W/System.err(24427): at android.app.Activity.<init>(Activity.java:735) 
06-29 17:37:19.175: W/System.err(24427): at com.google.android.maps.MapActivity.<init>(MapActivity.java:272) 
06-29 17:37:19.185: W/System.err(24427): at it.univpm.dii.socialfoot.SocialFootActivity.<init>(SocialFootActivity.java:56) 
06-29 17:37:19.185: W/System.err(24427): at it.univpm.dii.socialfoot.PostMsg.doInBackground(PostMsg.java:13) 
06-29 17:37:19.185: W/System.err(24427): at it.univpm.dii.socialfoot.PostMsg.doInBackground(PostMsg.java:1) 
06-29 17:37:19.185: W/System.err(24427): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
06-29 17:37:19.185: W/System.err(24427): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
06-29 17:37:19.185: W/System.err(24427): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
06-29 17:37:19.195: W/System.err(24427): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
06-29 17:37:19.195: W/System.err(24427): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
06-29 17:37:19.195: W/System.err(24427): at java.lang.Thread.run(Thread.java:856) 
+1

請提供logcat – rajpara

+0

logcat現在加入 –

回答

2

有在這一行代碼的錯誤:

SocialFootActivity.this.runOnUiThread(new Runnable() { 
            @Override 
            public void run() { 
           new PostMsg().execute("Hello World"); 
            }}); 

爲什麼你想使用runOnUiThread()運行AsyncTask

你想簡單地調用AsyncTaskOnClick()方法是這樣的:

OnCheckedChangeListener toggleButtonListener = new OnCheckedChangeListener() { 
// called when user toggles session state 
@Override 
public void onCheckedChanged(CompoundButton buttonView, 
     boolean isChecked) { 
     if (!isChecked) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(
       SocialFootActivity.this); 
     builder.setMessage(
       "Do you want to share on facebook") 
       .setCancelable(false) 
       .setPositiveButton("Yes", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, 
            int id) { 

           new PostMsg().execute("Hello World"); 
            }); 
          } 

然後顯示在您的AsyncTaskonPreExecute()將在UI線程來顯示,而您的doInBackground()會發生一個progressdialog在後臺非UI線程中。

+0

processdialog是必要的嗎???我嘗試了你的建議(在onpreexecute沒有進程對話框),我有相同的錯誤 –

+0

如果你沒有顯示progressDialog,並且如果需要更多時間從服務器獲取響應,那麼你可能會得到一個ANR異常。 –

+0

感謝它與processdialog一起工作! –

相關問題