当前位置: 首页 > 知识库问答 >
问题:

Android AsyncTask doInBackground在一部手机上工作,但在其他手机上不

汪安宁
2023-03-14

它们具有onPreExecute、doInBackground和onPostExecute方法,用于使用Internet与phphtml" target="_blank">文件通信。当我在Samsung Galaxy S7中运行它,并做一个toast.maketext,用于在屏幕上显示各种方法中的文本时,它工作得非常好。但是当我在Huawei CAM-L03中运行它时,只向我显示onPreExecute和onPostExecute的文本,而从不进入doInBackground,我也不知道为什么。

要调用类,我执行以下操作:

Sender s=新发件人(mainactivity.this,URL_Total);

这是我的建筑。格雷德尔:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "com.example.pruebainsp"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    implementation 'com.android.support:design:26.1.0'
    implementation files('libs/PhotoUtil.jar')
    implementation files('libs/GenAsync.1.2.jar')
}

编辑1:祝酒词不是真正的问题..我只为视图添加它们,只是为了检查方法。真正的麻烦是DoInBackground不运行或做任何事情。

下面是Sender类的代码。Samsung Galaxy S7输入if(mainactivity.ResponseWeb!=null),但在华为CAM-L03中ResponseWeb始终为null,所以每次我都收到消息toast.maketext(c,“error:response”+mainactivity.ResponseWeb,toast.length_short).show();,而且从来没有去做连接的私有字符串send(),因为doInBackground在这里不起作用(只在华为手机中)。

GO TO EDIT 2

编辑2:我用日志更新代码,下面是:

public class Sender extends AsyncTask<Void,Void,String> {
    Context c;
    String urlAddress;
    ProgressDialog pd;
    String fileTodosUsers = "TodosUsuarios";

    private static final String TAG = Sender.class.getSimpleName();
    /*
            1.OUR CONSTRUCTOR
    2.RECEIVE CONTEXT,URL ADDRESS AND EDITTEXTS FROM OUR MAINACTIVITY
    */
    public Sender(Context c, String urlAddress) {
        this.c = c;
        this.urlAddress = urlAddress;
        //Log.v(TAG, "Mensaje 2");
    }
    /*
   1.SHOW PROGRESS DIALOG WHILE DOWNLOADING DATA
    */
    @Override
    protected void onPreExecute() {
        Log.i(TAG, "OnPre");
        super.onPreExecute();
        pd=new ProgressDialog(c);
        pd.setTitle("En Proceso");
        pd.setMessage("Procesando datos...Espere por favor");
        pd.show();
    }
    /*
    1.WHERE WE SEND DATA TO NETWORK
    2.RETURNS FOR US A STRING
     */
    @Override
    protected String doInBackground(Void... params) {
        Log.i(TAG, "doInBack");
        return this.send();
    }
    /*
  1. CALLED WHEN JOB IS OVER
  2. WE DISMISS OUR PD
  3.RECEIVE A STRING FROM DOINBACKGROUND
   */
    @Override
    protected void onPostExecute(String response) {
        Log.i(TAG, "onPost");
        super.onPostExecute(response);
        MainActivity.ResponseWeb = response;

        if (MainActivity.ResponseWeb != null) {
         //...
         //HERE CODE DO SOME STUFF
         //...
        }
        else {
            Toast.makeText(c, "Error: response " + MainActivity.ResponseWeb , Toast.LENGTH_SHORT).show();
        }
        pd.dismiss();
    }
    
    
    /*
    SEND DATA OVER THE NETWORK
    RECEIVE AND RETURN A RESPONSE
     */
    private String send()
    {
        Log.i(TAG, "On Send 1");
        //CONNECT
        HttpURLConnection con=Connector.connect(urlAddress);
        Log.i(TAG, "On Send 2");
        if(con==null)
        {
            Log.i(TAG, "On Send 3");
            return null;
        }
        try
        {
            Log.i(TAG, "On Send 4");
            OutputStream os=con.getOutputStream();
            Log.i(TAG, "On Send 5");
            //WRITE
            BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os,"UTF-8"));
            Log.i(TAG, "On Send 6");
            bw.flush();
            Log.i(TAG, "On Send 7");
            //RELEASE RES
            bw.close();
            Log.i(TAG, "On Send 8");
            os.close();
            Log.i(TAG, "On Send 9");
            //HAS IT BEEN SUCCESSFUL?
            int responseCode=con.getResponseCode();
            Log.i(TAG, "On Send 10");
            Log.i(TAG, "responseCode = " + responseCode);
            if(responseCode==con.HTTP_OK)
            {
                Log.i(TAG, "On Send 11");
                //GET EXACT RESPONSE
                BufferedReader br=new BufferedReader(new InputStreamReader(con.getInputStream()));
                Log.i(TAG, "On Send 12");
                StringBuffer response=new StringBuffer();
                Log.i(TAG, "On Send 13");
                String line;
                Log.i(TAG, "On Send 14");
                //READ LINE BY LINE
                while ((line=br.readLine()) != null)
                {
                    Log.i(TAG, "On Send 15");
                    response.append(line);
                }
                //RELEASE RES
                Log.i(TAG, "On Send 16");
                br.close();
                Log.i(TAG, "On Send 17");
                return response.toString();
            }else
            {
                Log.i(TAG, "On Send 18");
            }
        } catch (IOException e) {
            Log.i(TAG, "On Send 19");
            e.printStackTrace();
        }
        Log.i(TAG, "On Send 20");
        return null;
    }

下面是logcat:

04-04 15:34:01.402 20341-20341/com.example.pruebainsp I/Sender: OnPre
04-04 15:34:01.445 20341-20550/com.example.pruebainsp I/Sender: doInBack
04-04 15:34:01.445 20341-20550/com.example.pruebainsp I/Sender: On Send 1
04-04 15:34:01.445 20341-20550/com.example.pruebainsp I/Sender: On Send 2
04-04 15:34:01.446 20341-20550/com.example.pruebainsp I/Sender: On Send 4
04-04 15:34:01.561 20341-20550/com.example.pruebainsp I/Sender: On Send 5
04-04 15:34:01.562 20341-20550/com.example.pruebainsp I/Sender: On Send 6
04-04 15:34:01.562 20341-20550/com.example.pruebainsp I/Sender: On Send 7
04-04 15:34:01.562 20341-20550/com.example.pruebainsp I/Sender: On Send 8
04-04 15:34:01.562 20341-20550/com.example.pruebainsp I/Sender: On Send 9
04-04 15:34:01.700 20341-20550/com.example.pruebainsp I/Sender: On Send 10
04-04 15:53:57.934 27226-27436/com.example.pruebainsp I/Sender: responseCode = 403
04-04 15:34:01.700 20341-20550/com.example.pruebainsp I/Sender: On Send 18
04-04 15:34:01.700 20341-20550/com.example.pruebainsp I/Sender: On Send 20
04-04 15:34:02.214 20341-20341/com.example.pruebainsp I/Sender: onPost

共有1个答案

方谦
2023-03-14

doinbackground()顾名思义是在后台线程中执行任务。理想情况下,您不能在后台线程上执行UI相关操作。三星的一些设备倾向于允许这样做,这是相当奇怪的。在某些手机上,它会直接使你的应用崩溃。

为了使它在所有设备上都能工作,您可以:

@Override
protected Object doInBackground(Object[] objects) {
    activityObj.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            Toast.makeText(contet, "Hello", Toast.LENGTH_LONG).show();
            }
    });
    return null;
}

@Override
protected Object doInBackground(Object[] objects) {
        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_LONG).show();
            }
        });
}
 类似资料:
  • 我需要实现具有暂停/恢复功能的音频录制,输出必须是m4a文件格式。所以我实现了PCM格式的录音。然后我使用(仅适用于旧的Android版本)我在这里找到的库-https://github.com/timsu/android-aac-enc 奇怪的是它适用于很多设备(比如我的nexus 7),但不适用于Samsung Star。没有崩溃,之后的玩家试图播放它,但只有一种非常奇怪的噪音。 我怀疑这与处

  • 问题内容: 这是我的代码,它可以在台式机和平板电脑上完美运行,但不能在移动设备上运行。是代码还是在移动设备上无法使用某些字体 问题答案: 您需要添加所有需要的内容来喜欢这个示例: 资料来源 :https://css-tricks.com/snippets/css/using-font-face/ 希望能有所帮助,加油。 ( 如果您需要转换字体,则需要此 字体生成器 )

  • 我有两个应用程序——基于浏览器的客户端和基于NodeJS的服务器,它们都使用WebSockets进行通信(我使用的是ColyseusJS库)。问题是,当我在本地主机上测试它们时,一切都正常,但当我将应用程序部署到我的Ubuntu VPS服务器时,它停止工作。 我在尝试连接时在浏览器中收到的消息是: 所以它到达服务器(因为当服务器被禁用时,消息是“连接建立中的错误:净::ERR_CONNECTION

  • FCM推送通知在以下设备中正常工作:当设备位于后台、前台时,以及当应用程序通过从托盘中刷卡关闭时。品牌名称(Android版)Micromax(5.1)摩托罗拉(7.1.1)诺基亚(8.1.0)三星(8.0.0)Nexus(8.1.0)小米(7.1.2) 但在oneplus中,当应用程序通过从托盘中刷卡关闭时,fcm通知不起作用,但当应用程序位于前台和后台时,fcm通知可以正常工作。设备版本One

  • 我已经在Drive:/SOFTWARES/wamp文件夹上安装了wamp服务器。 但是在这里,我有一个问题。 只有localhost向我显示wamp索引页。 如果我输入网址,设置为虚拟主机,要么1。当我不使用互联网时,它们显示“无法连接”。2.他们通过网络重定向到一些网址。 我在wamp安装后采取的步骤: 1) 联合国对httpd中的vhost配置行进行了评论。配置文件 3) 在windows的主

  • 我试图建立一个应用程序与代号之一,上传一个服务器的照片从相机捕获,然后缩小到300x300连同GPS坐标。 在模拟器(Iphone或ANdroid)上,一切都工作得很好,照片被接收并存储在服务器上,其他数据也是如此。在构建了Android应用程序后,它在Android上也能正常工作。 所以我不确定我是不是在代号One上做错了什么,还是和Laravel有关系。 在CN1中,我使用以下方式发送数据: