RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 768106
Accepted
Pavel Zlotarenchuk
Pavel Zlotarenchuk
Asked:2020-01-09 02:31:13 +0000 UTC2020-01-09 02:31:13 +0000 UTC 2020-01-09 02:31:13 +0000 UTC

安卓线程问题

  • 772

有以下代码:

package tanat.androidtesttask;

import android.app.DialogFragment;
import android.app.ListFragment;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.RequiresApi;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainList extends ListFragment implements SwipeRefreshLayout.OnRefreshListener{

    SwipeRefreshLayout mSwipeRefreshLayout;
    ArrayList data;
    DialogFragment dialogFragment;

    //подключаем мой фрагмент
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_item, null);

        dialogFragment = new MyDialog();

        mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.refresh);
        mSwipeRefreshLayout.setOnRefreshListener(this);
        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState){

        dialogFragment.show(getFragmentManager(), "");

        final Thread thread = new Thread(new Runnable() {

            @Override
            public void run() {
                data = new MainActivity().demo();
            }
        });
        thread.start();
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        dialogFragment.dismiss();


        //      dialogFragment.show(getFragmentManager(), "");

 //       data = new MainActivity().demo();

        //создаем лист фрагментов
        super.onActivityCreated(savedInstanceState);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_list_item_1, data);
        setListAdapter(adapter);
    }

    @Override
    public void onStart() {
        super.onStart();

    }

    //вешаем слушатель на нажатие фрагмента
    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        //передаем позицию елемента в второе активити
        //создаем интент
        Intent intent = new Intent(MainList.this.getContext(), InfoRoutActivity.class);
        //записываем в него ключ и позицию
        intent.putExtra("position", position);
        //передаем
        startActivity(intent);
    }

    //свайп вниз для обновления
    @Override
    public void onRefresh() {
        // говорим о том, что собираемся начать
        Toast.makeText(getActivity(), "Обновляем", Toast.LENGTH_SHORT).show();
        // начинаем показывать прогресс
        mSwipeRefreshLayout.setRefreshing(true);
        // ждем 3 секунды и прячем прогресс
        mSwipeRefreshLayout.postDelayed(new Runnable() {
            @Override
            public void run() {
                mSwipeRefreshLayout.setRefreshing(false);
                // говорим о том, что собираемся закончить
                Toast.makeText(getActivity(),"обновили", Toast.LENGTH_SHORT).show();
            }
        }, 3000);
    }
}

这是片段类。当它被创建时,另一个片段被调用,它只是一个自定义的DialogFragment,就像一个进度对话框。和团队

data = new MainActivity().demo();

进入活动,从它到服务并加载 json,然后我们等到这个线程被执行并关闭进度对话框,然后我们从我们下载的数据中创建一个 ListFragment,至少按照预期,但是在这个命令上敲出以下错误

E/AndroidRuntime: FATAL EXCEPTION: Thread-130
                  Process: tanat.androidtesttask, PID: 1700
                  java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
                      at android.os.Handler.<init>(Handler.java:200)
                      at android.os.Handler.<init>(Handler.java:114)
                      at android.app.Activity.<init>(Activity.java:754)
                      at tanat.androidtesttask.MainActivity.<init>(MainActivity.java:0)
                      at tanat.androidtesttask.MainList$1.run(MainList.java:50)
                      at java.lang.Thread.run(Thread.java:818)

我已经尝试过使用 Handler 但我无法弄清楚在这种情况下如何正确使用它,我已经在互联网上翻找了 2 天但无济于事。请帮助提前谢谢。

java
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Mister_Jesus
    2020-01-09T18:18:14Z2020-01-09T18:18:14Z

    因此,Handler是一个用于与它所连接的流进行通信的接口。它将运行的线程作为参数(实际上是一个特殊的类对象Looper,有关 Handler 的文档)。该调用Handle handler = new Handler() {...}绑定Handler到当前线程。那些。对象的函数将在其创建上下文中执行。这意味着我们可以使用Handler.

    例如:

    HandlerThread getThread = new HandlerThread("getThread"); // Создали поток 
    getThread.start(); // Запустили
    getHandler = new Handler(getThread.getLooper()); // Получили объект Looper потока
    getHandler.post(new Runnable() {...}); // Выдали код на исполнение потоку getThread
    getHandler.obtainMessage(1, new SomeObject()); // Отослали сообщение с пользовательским типом и объект для обработки в параметре arg1.
    

    从示例中可以看出,我们创建了一个新线程(请注意,该类HandlerThread已经具有Looper. 常规Thread的将没有它,您必须手动控制它的生命周期),接收对象Looper并声明Handler. 现在我们可以通过调用方法发送不同的消息或将其执行代码提供给线程getHandler。

    一个好的 android 初学者教程链接,官方指南,强烈推荐阅读我上面的评论和链接中的文章。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5