Android中的线程实现不起作用

Posted

技术标签:

【中文标题】Android中的线程实现不起作用【英文标题】:Implements of thread in Android doesn't work 【发布时间】:2015-11-25 15:49:28 【问题描述】:

我正在编写一个android中的基本应用程序,该应用程序将通过php中的请求连接到mysql服务器,在Android Internet连接必须在不同的线程中进行,所以我创建了实现Runnable接口的类。

package com.company.opax.loginmysql;

import android.util.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;

/**
 * Created by opax on 30.08.2015.
 */

public class HttpPostMethod implements Runnable
    private String fileInHost;
    private ArrayList<PostParameters> postParameterses;
    private StringBuffer postResult;

    public HttpPostMethod(String fileInHost, ArrayList<PostParameters> postParameterses)
        this.fileInHost = fileInHost;
        this.postParameterses = new ArrayList<PostParameters>(postParameterses);
    

    public String getResult() 
        return postResult.toString();
    

    @Override
    public void run() 
        try 
            String urlParameters = generateParameters();
            URLConnection conn = initializeUrlConnection();

            OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
            writer.write(urlParameters);
            writer.flush();

            String line;
            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

            while ((line = reader.readLine()) != null) 
                postResult.append(line);
            

            writer.close();
            reader.close();
         catch (IOException e) 
            Log.e("Exception", this.getClass().getName() + " name: " + e.toString());
        
    

    private URLConnection initializeUrlConnection() throws MalformedURLException 
        URL url = new URL(fileInHost);
        URLConnection conn;

        try 
            conn = url.openConnection();
            conn.setDoOutput(true);
        catch(IOException e)
            throw new MalformedURLException();
        

        return conn;
    

    private String generateParameters()
        StringBuffer finishPostQuery = new StringBuffer();

        for(PostParameters p : postParameterses)
            finishPostQuery.append(p.getNameParam());
            finishPostQuery.append("=");
            finishPostQuery.append(p.getValueParam());
            finishPostQuery.append("&");
        

        if(!finishPostQuery.toString().equals("login=seba&password=pass&"))
            throw new AssertionError("blad generatora zapytania: " + finishPostQuery);

        return finishPostQuery.toString();
    

登录类

public class Login 
    private User user;
    private final String paramLogin = "login";
    private final String paramPass = "password";

    public Login(User user)
        this.user = user;
    

    public boolean tryLogin()
        try
            ArrayList<PostParameters> postParameterses = new ArrayList<>();
            postParameterses.add(new PostParameters(paramLogin, user.getUserName()));
            postParameterses.add(new PostParameters(paramPass, user.getUserPass()));

            HttpPostMethod httpPostMethod = new HttpPostMethod("http://blaba.php", postParameterses);
            httpPostMethod.run();
            Log.i("bla", httpPostMethod.getResult());

         catch (Exception e) 
            Log.i("Exception", e.toString());
        
        return false;
    

我正在尝试连接其他线程,但仍然出现错误:'android.os.NetworkOnMainThreadException' 对于我做错的所有建议,我将不胜感激。

【问题讨论】:

您正在实现Runnable,它只是一个接口,不会使您的类成为线程。尝试扩展Thread (HttpPostMethod extends Thread) 并调用start 方法而不是run 我的建议是使用 Asynctask vogella.com/tutorials/AndroidBackgroundProcessing/article.html 【参考方案1】:

代替:

httpPostMethod.run();

做:

new Thread(httpPostMethod).start();

如果您的登录调用由于某些原因(超时、登录错误)而失败,您应该以某种方式向用户报告 - 这就是 AsyncTask 类的用途。它允许您在 doInBackkground 中运行后台代码,并且在网络操作结束后 - 在 onPostExecute 中,您可以执行 UI 相关的东西 - 例如显示错误/结果。

【讨论】:

【参考方案2】:

我建议你两件事。 首先使用 AsyncTask 代替纯 java 线程。

但主要的建议是使用发出 http 请求的库。 我喜欢使用Retrofit,它可以为你处理所有请求和线程部分,但还有其他的。

【讨论】:

以上是关于Android中的线程实现不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Django中的线程在生产中不起作用

所选项目上的 Android 微调器不起作用?

Xamarin.iOS 中的 Azure 推送通知不起作用

是否已经有适用于 android 的 StopWatch 类,为啥我的实现不起作用?

从后台线程中的委托方法更改 UILabel 的文本不起作用

Android 中的 ProGuard 不起作用。(不混淆)