2016-03-15 41 views
0

我在AsyncTask期间尝试显示和隐藏对话框时遇到了问题我已将放在一起的活动放在我的Android应用程序中。AysncTask - 从主UI调用线程

这是目前我在做什么:

public void syncCard(final Tag tag) { 
    syncTask = new SyncTask(); 
    syncTask.execute(tag); 
} 

private class SyncTask extends AsyncTask<Tag, Void, Void> { 
    private final Dialog dialog; 
    private boolean mException; 

    public SyncTask() { 
     // Prepare dialog 
     dialog = buildSyncingDialog(); 
    } 

    @Override 
    protected void onPreExecute() { 
     dialog.show(); 
    } 

    @Override 
    protected Void doInBackground(Tag... params) { 
     mTagcomm = IsoDep.get(params[0]); 
     if (mTagcomm == null) { 
      //TODO - Handle communication error with the present card 
     } 
     mException = false; 

     try { 
      // Open connection 
      mTagcomm.connect(); 
      lastAts = getAts(mTagcomm); 

      mProvider.setmTagCom(mTagcomm); 

      EmvParser parser = new EmvParser(mProvider, true); 
      mCard = parser.readEmvCard(); 
      if (mCard != null) { 
       mCard.setAtrDescription(extractAtsDescription(lastAts)); 
      } 

     } catch (IOException e) { 
      mException = true; 
     } finally { 
      // close tagcomm 
      IOUtils.closeQuietly(mTagcomm); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     if (dialog.isShowing()) { 
      dialog.dismiss(); 
     } 

     if (!mException) { 
      if (mCard != null) { 
       showPaymentCardDetails(); 
      } else if (mCard.isNfcLocked()) { 
       //TODO - Show error message informing user the card is locked 
      } 
     } else { 

     } 
    } 

    private Dialog buildSyncingDialog() { 
     String syncingText = String.format("%s\n%s", 
       getString(R.string.syncing), getString(R.string.do_not_remove_card)); 
     Dialog dialog = new CustomDialog(PaymentCardRegisterActivity.this, 
       syncingText, R.layout.layout_syncing); 
     dialog.setCancelable(false); 

     return dialog; 
    } 

    @Override 
    public void onCancelled() { 
     dialog.dismiss(); 
    } 
} 

我看到了以下错误:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

我碰到这个老答案出来 - Can't create handler inside thread which has not called Looper.prepare()

但我对于我需要做什么,m仍然有点困惑,对这篇文章的最后一个回应是说从UI线程运行任务,我将如何使用上面的代码去做这件事?

编辑

我的活动课,因为我使用这个类来读取非接触式卡的详细信息延伸NfcActivity

syncCard正在从另一个后台线程(我相信)被称为像这样

@Override 
public void onNewIntent(final Intent intent) { 
    super.onNewIntent(intent); 
    processIntent(intent); 
} 

private void processIntent(final Intent intent) { 
    String action = intent.getAction(); 

    if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) { 
     Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
     onTagDiscovered(tagFromIntent); 
    } 
} 

@Override 
public void onTagDiscovered(final Tag tag) { 
    super.onTagDiscovered(tag); 
    try { 
     PaymentCardRegisterActivity.this.syncCard(tag); 
    } catch (Exception e) { 
     Log.e(PaymentCardRegisterActivity.class.getName(), "Failed to sync card", e); 
     // Return to start activity 
     finish(); 
    } 
} 
+1

如何/哪里是'syncCard()'叫什么名字? – codeMagic

+0

你可能会从一些后台线程开始asynctask –

+0

啊,好吧,我确实从后台线程开始。我正确地认为主UI线程来自Activity类中'onCreate'中的调用? – mindparse

回答

1

如果onTagDiscovered是在一个线程,是不是UI线程中运行,那么你应该派遣您的来电syncCard到主线程。如果您参考了Activity,则可以使用runOnUiThread并发布Runnable。这将确保Runnable在主线程上执行。 在你的代码,我想你需要改变这种

@Override 
public void onTagDiscovered(final Tag tag) { 
    super.onTagDiscovered(tag); 
    try 
    { 
      PaymentCardRegisterActivity.this.syncCard(tag); 
    } 
    catch (Exception e) 
    { 
      Log.e(PaymentCardRegisterActivity.class.getName(), "Failed to sync card", e); 
      // Return to start activity 
      finish(); 
    } 
} 

这个

@Override 
public void onTagDiscovered(final Tag tag) { 
    super.onTagDiscovered(tag); 
    runOnUiThread(new Runnable() { 

     public void run() { 
      try { 
       PaymentCardRegisterActivity.this.syncCard(tag); 
      } catch (Exception e) { 
       Log.e(PaymentCardRegisterActivity.class.getName(), "Failed to sync card", e); 
      } 
     } 
    }); 
} 
相关问题