#android #android-asynctask
#Android #android-asynctask
Вопрос:
Я написал приемник для намерения NEW_OUTGOING_CALL (статический приемник). Чтобы не задерживать систему, я выполняю длительную часть процесса в AsyncTask.
В зависимости от набранного номера я могу запустить AsyncTask (и продолжить обычную обработку), а могу и не запускать. Однако задачи запускаются сами по себе, с переданным правильным параметром, и я не могу понять, как!! Я обработал проект grep, и нет других вызовов LongOperation, кроме того, что в функции CallOneShot — но трассировки, окружающие оператор ‘new’, не отображаются.
Как это может произойти?
Пожалуйста, найдите прилагаемый код, извините за длину, я попытался его немного сократить
Спасибо за помощь J.
package com.iper.phoneeco;
public class MyReceiver extends BroadcastReceiver {
private static final String TAG = "XXBroadcastReceiver";
FileWriter fDevLog;
MyPrefs myprefs=null;
public final static String EXTRA_MESSAGE = "com.iper.phoneeco.msg1";
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equalsIgnoreCase("android.intent.action.NEW_OUTGOING_CALL"))
{
Log.d(TAG,"OUTGOING CALL RECEIVED");
String phoneNumber = getResultData();
if (phoneNumber == null) {
// No reformatted number, use the original
phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
}
Log.d(TAG,"phone number:" phoneNumber);
if (IsToProcess(phoneNumber)) {
Log.d (TAG,"Trapping the call");
// Lets Roll
CallOneShot(phoneNumber);
// and prevent other apps from calling as well
setResultData(null);
// abortBroadcast();
}
else {
Log.d (TAG,"Standard processing");
Toast.makeText(context, "standard processing" , Toast.LENGTH_LONG).show();
}
Log.d (TAG,"Finished processing intent");
}
//
// check is number against a list of exceptions, that we dont handle
//
private boolean IsToProcess(String num){
String[] excluded = {"15","17","18","112","911","991","08.*","^\*.*","^#.*"};
for (String ex : excluded){
Log.d(TAG,"Exclusion test: " ex "versus: " num);
if (num.matches(ex)) {
Log.d(TAG,"Exclusion FOUND: " ex);
return false;
}
}
if (num.length() < myprefs.minLen) {
Log.d(TAG,"Exclusion FOUND: Numero trop court");
return false;
}
Log.d(TAG,"Exclusion not found: ");
return true;
}
//
// Displays a toast
//
void MyToast(String s, int col, int dur ) {
Toast toast=Toast.makeText(myprefs.ctx, s, dur);
toast.setGravity(Gravity.CENTER_HORIZONTAL, 0, 0);
toast.getView().setBackgroundColor(col );
LinearLayout toastLayout = (LinearLayout) toast.getView();
TextView toastTV = (TextView) toastLayout.getChildAt(0);
toastTV.setTextSize(20);
toast.show();
}
void MyToast(String s, int col) {
MyToast(s,col,Toast.LENGTH_LONG);
}
public void CallOneShot(String phoneNumber) {
Log.d (TAG,"CallOneShot");
MyToast (myprefs.ctx.getResources().getString(R.string.callbackipg) " " phoneNumber,Color.BLUE);
new LongOperation().execute(phoneNumber);
}
//
// the meat....
//
public class LongOperation extends AsyncTask<String, Void, String> {
String numToCall;
@Override
protected String doInBackground(String... params) {
int bytesRead;
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024);
byte[] buffer = new byte[1024];
String msgres;
String response;
Log.d(TAG, "Clientthread started");
numToCall=params[0];
Log.d(TAG, "numTocall" numToCall);
// and add to the call log
ContentValues values = new ContentValues();
values.put(CallLog.Calls.NUMBER, numToCall);
values.put(CallLog.Calls.DATE, System.currentTimeMillis());
values.put(CallLog.Calls.DURATION, 0);
values.put(CallLog.Calls.TYPE, CallLog.Calls.OUTGOING_TYPE);
values.put(CallLog.Calls.NEW, 1);
values.put(CallLog.Calls.CACHED_NAME, "");
values.put(CallLog.Calls.CACHED_NUMBER_TYPE, 0);
values.put(CallLog.Calls.CACHED_NUMBER_LABEL, "");
Log.d(TAG, "Inserting call log placeholder for " numToCall);
ContentResolver resolver = myprefs.ctx.getContentResolver();
resolver.insert(CallLog.Calls.CONTENT_URI, values);
response=myprefs.ctx.getResources().getString(R.string.errundef);
return response;
}
protected void onPostExecute (String s) {
if (!s.equals("ok")) {
Log.d(TAG,"OnPostExecute - failed: " s);
MyToast (myprefs.ctx.getResources().getString(R.string.errcallback) "n" s,Color.RED);
}
}
}
}
Ответ №1:
Вы присвоили значение myprefs. Кажется, что вы инициализировали его равным null и никогда не присваиваете ему какое-либо значение
Комментарии:
1. спасибо за ответ. Да, я отредактировал код, чтобы он выглядел более удобным для чтения. Ключевая проблема заключается в том, что экземпляр LongOperation оживает без вызова! Смотрите полный класс здесь: pastebin.com/7a7bURBi
2. Измените определение класса longOperation с общедоступного на статический
3. Просто сделал это, и это не меняется. В любом случае спасибо за помощь
Ответ №2:
ок — ответ «глупый я» — я изменил название пакета, и старая версия пакета все еще была в эмуляторе, перехватывая намерение! как только я удалил его, все вернулось к нормальной жизни…
В любом случае большое спасибо за вашу помощь